In x86 - Assembler - Code sind JE
und JNE
genau das gleiche wie JZ
und JNZ
?
In x86 - Assembler - Code sind JE
und JNE
genau das gleiche wie JZ
und JNZ
?
Antworten:
JE
und JZ
sind nur verschiedene Namen für genau dasselbe: ein bedingter Sprung, wenn ZF
(das "Null" -Flag) gleich 1 ist.
(Ähnlich JNE
und JNZ
sind nur verschiedene Namen für einen bedingten Sprung, wenn er ZF
gleich 0 ist.)
Sie könnten sie austauschbar verwenden, aber Sie sollten sie verwenden, je nachdem, was Sie tun:
JZ
/ JNZ
Sind besser geeignet , wenn Sie ausdrücklich etwas paribus auf Null zu testen sind:
dec ecx
jz counter_is_now_zero
JE
und JNE
sind nach einer CMP
Anweisung besser geeignet :
cmp edx, 42
je the_answer_is_42
(Ein CMP
Befehl führt eine Subtraktion durch und wirft den Wert des Ergebnisses weg, während die Flags ZF=1
beibehalten werden. Deshalb erhalten Sie, wenn die Operanden gleich sind und ZF=0
wenn sie nicht.)
jb
/ jc
/ jnae
alle Tests CF = 1. Siehe felixcloutier.com/x86/jcc (oder cmovcc oder setcc)
Aus dem Intel-Handbuch - Instruction Set Reference , haben die JE
und JZ
den gleichen Opcode ( 74
für rel8 / 0F 84
für rel 16/32) JNE
und JNZ
( 75
für rel8 / 0F 85
für rel 16/32) Opcodes gemeinsam.
JE
und JZ
beide suchen nach dem ZF
(oder Null-Flag), obwohl sich das Handbuch in den Beschreibungen der ersten Verwendung von JE
rel8 und JZ
rel8 geringfügig unterscheidet ZF
, aber im Grunde sind sie gleich.
Hier ist ein Auszug aus den Seiten 464, 465 und 467 des Handbuchs.
Op Code | mnemonic | Description
-----------|-----------|-----------------------------------------------
74 cb | JE rel8 | Jump short if equal (ZF=1).
74 cb | JZ rel8 | Jump short if zero (ZF ← 1).
0F 84 cw | JE rel16 | Jump near if equal (ZF=1). Not supported in 64-bit mode.
0F 84 cw | JZ rel16 | Jump near if 0 (ZF=1). Not supported in 64-bit mode.
0F 84 cd | JE rel32 | Jump near if equal (ZF=1).
0F 84 cd | JZ rel32 | Jump near if 0 (ZF=1).
75 cb | JNE rel8 | Jump short if not equal (ZF=0).
75 cb | JNZ rel8 | Jump short if not zero (ZF=0).
0F 85 cd | JNE rel32 | Jump near if not equal (ZF=0).
0F 85 cd | JNZ rel32 | Jump near if not zero (ZF=0).
je : Jump if equal:
399 3fb: 64 48 33 0c 25 28 00 xor %fs:0x28,%rcx
400 402: 00 00
401 404: 74 05 je 40b <sims_get_counter+0x51>