106 votes

Différence entre JE/JNE et JZ/JNZ

En code assembleur x86, sont JE y JNE exactement la même chose que JZ y JNZ ?

142voto

Matthew Slattery Points 21628

JE y JZ ne sont que des noms différents pour désigner exactement la même chose : une saut conditionnel lorsque ZF (l'indicateur "zéro") est égal à 1.

(De même, JNE y JNZ sont juste des noms différents pour un saut conditionnel lorsque ZF est égal à 0).

Vous pourrait les utiliser de manière interchangeable, mais vous devrait les utiliser en fonction de ce que vous faites :

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

    dec  ecx
    jz   counter_is_now_zero
  • JE y JNE sont plus appropriés après un CMP l'instruction :

    cmp  edx, 42
    je   the_answer_is_42

    (A CMP effectue une soustraction, et jette la valeur du résultat, tout en conservant les drapeaux ; c'est pourquoi vous obtenez ZF=1 lorsque les opérandes sont égaux et ZF=0 alors qu'ils ne le sont pas.)

42voto

higuaro Points 7796

Desde el Manuel d'Intel - Instruction Set Reference le JE y JZ ont le même opcode ( 74 pour rel8 / 0F 84 pour rel 16/32) également JNE y JNZ ( 75 pour rel8 / 0F 85 pour les opcodes de partage rel 16/32).

JE y JZ ils vérifient tous deux la présence du ZF (ou drapeau zéro), bien que le manuel diffère légèrement dans les descriptions du premier JE rel8 et JZ rel8 ZF l'utilisation, 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).

-7voto

leesagacious Points 83
  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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X