Différence entre JE / JNE et JZ / JNZ
Dans le code assembleur x86, sont JE
et JNE
exactement le même que JZ
et JNZ
?
2 réponses
JE
et JZ
sont juste des noms différents, pour exactement la même chose: une
saut conditionnel lorsque ZF
(le drapeau" Zéro") est égal à 1.
(de même, JNE
et JNZ
ne sont que des noms différents pour un saut conditionnel
lorsque ZF
est égal à 0.)
Vous peut utiliser de manière interchangeable, mais vous devraient utiliser en fonction de ce que vous faites:
-
JZ
/JNZ
sont plus appropriés lorsque vous sont explicitement test pour avoir quelque chose de égal à zéro:dec ecx jz counter_is_now_zero
-
JE
etJNE
sont plus appropriées après unCMP
instruction:cmp edx, 42 je the_answer_is_42
(une instruction
CMP
effectue une soustraction et renvoie la valeur du résultat, tout en gardant les drapeaux; c'est pourquoi vous obtenezZF=1
lorsque les opérandes sont égaux etZF=0
quand ils ne le sont pas.)
À partir de la référence du jeu D'Instructions manuelles D'Intel, les JE
et JZ
ont le même opcode (74
pour rel8 / 0F 84
pour rel 16/32) également JNE
et JNZ
(75
pour rel8 / 0F 85
pour rel 16/32) partager des opcodes.
JE
et JZ
ils vérifient tous les deux le ZF
(ou le drapeau zéro), bien que le manuel diffère légèrement dans les descriptions de la première utilisation JE
rel8 et JZ
rel8 ZF
, mais fondamentalement ils sont les mêmes.
Voici un extrait du manuel pages 464, 465 et 467.
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).