was macht die cmpq-Anweisung?

8

Ich habe die folgende Definition für syscall gelesen:

%Vor%

Ich habe gesehen, dass die Zeile cmpq $-4095 %rax bestimmt, ob% rax einen Wert zwischen -1 und -4095 enthält. Wie macht es das? Was genau macht die Cmpq-Anweisung?

    
brooks94 29.01.2014, 19:13
quelle

1 Antwort

11

cmpq $-4095, %rax vergleicht das 64-Bit-Register% rax mit dem unmittelbaren Wert -4095 - der Wert wird für den Vergleich auf 64-Bit vorzeichenerweitert. h. -4095 hat die 64-Bit Zweierkomplementdarstellung: ffff ffff ffff f001

cmp Instruktionen setzen das Flagsregister so, wie es für eine sub (Subtraktion) des zweiten Operanden von der ersten wäre - "zweite" und "erste" werden in AT & amp; T Syntax umgekehrt. In der Tat werden die Flags entsprechend dem Ergebnis von (RAX - (- 4095)) oder (RAX + 4095) gesetzt, wobei sie im Zweierkomplement gleich sind.

Eines der Flags ist das Flag carry (CF), das auf (unsigned) overflow gesetzt ist. Der Befehl jae (jump-wenn-ob-gleich) ist eigentlich ein 'Alias' für jnc (jump-if-not-carry). Mit anderen Worten, die Verzweigung wird genommen, wenn (RAX + 4095) nicht überträgt. Im Zweierkomplement gilt dies für Werte von RAX im Bereich: [-4095, -1] . (Denken Sie daran, wie arithmetische Umbrüche von Zweierkomplementen).

Die Anweisungen, einschließlich cmp und jae (oder j<cond> ), sind beschrieben in: Intel® 64 und IA-32 Architectures Software-Entwicklerhandbuch, Band 2 .

Das [E] FLAGS-Register (und was die arithmetischen Flags anzeigen) wird in Abschnitt 3.4.3 von Entwicklerhandbuch für Intel® 64 und IA-32 Architectures, Band 1 .

    
Brett Hale 29.01.2014 20:03
quelle

Tags und Links