web-dev-qa-db-fra.com

Différence entre JE / JNE et JZ / JNZ

Dans le code d'assemblage x86, JE et JNE sont-ils exactement identiques à JZ et JNZ?

74
QuasarDonkey

JE et JZ ne sont que des noms différents pour exactement la même chose: un 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 pouvez les utiliser de manière interchangeable, mais vous devriez les utiliser en fonction de ce que vous faites:

  • JZ/JNZ sont plus appropriés lorsque vous testez explicitement si quelque chose est égal à zéro:

    dec  ecx
    jz   counter_is_now_zero
    
  • JE et JNE sont plus appropriés après une instruction CMP:

    cmp  edx, 42
    je   the_answer_is_42
    

    (Une instruction CMP effectue une soustraction et jette la valeur du résultat en conservant les indicateurs; c’est pourquoi vous obtenez ZF=1 lorsque les opérandes sont égaux et ZF=0 quand ils ne le sont pas.)

104
Matthew Slattery

À partir de Manuel d’Intel - Référence du jeu d’instructions , 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 du premier JE rel8 et JZ rel8 ZF usage, mais ils sont fondamentalement 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).
34
higuaro