Dans le code d'assemblage x86, sont JE
et JNE
exactement les mêmes que JZ
et JNZ
?
Dans le code d'assemblage x86, sont JE
et JNE
exactement les mêmes que JZ
et JNZ
?
Réponses:
JE
et JZ
sont juste des noms différents pour exactement la même chose: un saut conditionnel quand ZF
(le drapeau "zéro") est égal à 1.
(De même, JNE
et JNZ
sont juste des noms différents pour un saut conditionnel quand ZF
est égal à 0.)
Vous pouvez les utiliser de façon interchangeable, mais vous devez les utiliser en fonction de ce que vous faites:
JZ
/ JNZ
sont plus appropriés lorsque vous testez explicitement quelque chose égal à zéro:
dec ecx
jz counter_is_now_zero
JE
et JNE
sont plus appropriés après une CMP
instruction:
cmp edx, 42
je the_answer_is_42
(Une CMP
instruction effectue une soustraction et rejette la valeur du résultat, tout en gardant les indicateurs; c'est pourquoi vous obtenez ZF=1
lorsque les opérandes sont égaux et ZF=0
quand ils ne le sont pas.)
jb
/ jc
/ jnae
tous les tests CF = 1. Voir felixcloutier.com/x86/jcc (ou cmovcc ou setcc)
Dans le manuel d'Intel - Instruction Set Reference , les JE
et JZ
ont le même opcode ( 74
pour rel8 / 0F 84
pour rel 16/32) aussi JNE
et JNZ
( 75
pour rel8 / 0F 85
pour rel 16/32) partagent des opcodes.
JE
et JZ
ils vérifient tous les deux le ZF
(ou l'indicateur zéro), bien que le manuel diffère légèrement dans les descriptions de la première utilisation de JE
rel8 et JZ
rel8 ZF
, mais fondamentalement ils sont les mêmes.
Voici un extrait des pages 464, 465 et 467 du manuel.
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).