In x86 - Assembler - Code sind JEund JNEgenau das gleiche wie JZund JNZ?
In x86 - Assembler - Code sind JEund JNEgenau das gleiche wie JZund JNZ?
Antworten:
JEund JZsind nur verschiedene Namen für genau dasselbe: ein bedingter Sprung, wenn ZF(das "Null" -Flag) gleich 1 ist.
(Ähnlich JNEund JNZsind nur verschiedene Namen für einen bedingten Sprung, wenn er ZFgleich 0 ist.)
Sie könnten sie austauschbar verwenden, aber Sie sollten sie verwenden, je nachdem, was Sie tun:
JZ/ JNZSind besser geeignet , wenn Sie ausdrücklich etwas paribus auf Null zu testen sind:
dec ecx
jz counter_is_now_zero
JEund JNEsind nach einer CMPAnweisung besser geeignet :
cmp edx, 42
je the_answer_is_42
(Ein CMPBefehl führt eine Subtraktion durch und wirft den Wert des Ergebnisses weg, während die Flags ZF=1beibehalten werden. Deshalb erhalten Sie, wenn die Operanden gleich sind und ZF=0wenn sie nicht.)
jb/ jc/ jnaealle Tests CF = 1. Siehe felixcloutier.com/x86/jcc (oder cmovcc oder setcc)
Aus dem Intel-Handbuch - Instruction Set Reference , haben die JEund JZden gleichen Opcode ( 74für rel8 / 0F 84für rel 16/32) JNEund JNZ( 75für rel8 / 0F 85für rel 16/32) Opcodes gemeinsam.
JEund JZbeide suchen nach dem ZF(oder Null-Flag), obwohl sich das Handbuch in den Beschreibungen der ersten Verwendung von JErel8 und JZrel8 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>