Kurze Antwort: nein. (Aber sie entsprechen genau dem gleichen Maschinencode, also machen sie genau das Gleiche. Sie haben nur unterschiedliche Mnemoniken für den gleichen Vergleich.)
4
JE bedeutet Sprung, wenn gleich, es ist gleich, wenn bei einem vorherigen Vergleich das Z-Flag gesetzt ist, JZ bedeutet Sprung, wenn das Z-Flag gesetzt ist. Sie sind genau die gleichen, einige Leute wollen denken / schreiben in Bezug auf meinen Vergleich war gleich oder nicht gleich. Einige Leute denken und schreiben in Bezug auf das Setzen der Z-Flagge oder das Löschen der Z-Flagge.
old_timer
Antworten:
122
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.)
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).
Antworten:
JE
undJZ
sind nur verschiedene Namen für genau dasselbe: ein bedingter Sprung, wennZF
(das "Null" -Flag) gleich 1 ist.(Ähnlich
JNE
undJNZ
sind nur verschiedene Namen für einen bedingten Sprung, wenn erZF
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:JE
undJNE
sind nach einerCMP
Anweisung besser geeignet :(Ein
CMP
Befehl führt eine Subtraktion durch und wirft den Wert des Ergebnisses weg, während die FlagsZF=1
beibehalten werden. Deshalb erhalten Sie, wenn die Operanden gleich sind undZF=0
wenn sie nicht.)quelle
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
undJZ
den gleichen Opcode (74
für rel8 /0F 84
für rel 16/32)JNE
undJNZ
(75
für rel8 /0F 85
für rel 16/32) Opcodes gemeinsam.JE
undJZ
beide suchen nach demZF
(oder Null-Flag), obwohl sich das Handbuch in den Beschreibungen der ersten Verwendung vonJE
rel8 undJZ
rel8 geringfügig unterscheidetZF
, aber im Grunde sind sie gleich.Hier ist ein Auszug aus den Seiten 464, 465 und 467 des Handbuchs.
quelle
quelle