Разница между JE / JNE и JZ/JNZ



в ассемблерном коде x86, are JE и JNE точно так же, как JZ и JNZ?

1532   2  

2 ответов:

JE и JZ просто разные имена для одного и того же: a условный прыжок, когда ZF (флаг "ноль") равен 1.

(аналогично, JNE и JNZ просто разные имена для условного прыжка когда ZF равно 0.)

вы может используйте их взаимозаменяемо, но вы должны использовать их в зависимости от что вы делаете:

  • JZ/JNZ более подходит, когда вы явно тестируете для чего-то равного нулю:

    dec  ecx
    jz   counter_is_now_zero
    
  • JE и JNE более уместны после CMP инструкция:

    cmp  edx, 42
    je   the_answer_is_42
    

    (A CMP инструкция выполняет вычитание и выбрасывает значение результата, сохраняя при этом флаги; именно поэтому вы получаете ZF=1 когда операнды равны и ZF=0 когда их нет.)

С руководство Intel - набор инструкций ссылка на JE и JZ имеют тот же код (74 для rel8 / 0F 84 для rel 16/32) также JNE и JNZ (75 для rel8 / 0F 85 для rel 16/32) доля опкодов.

JE и JZ Они оба проверяют на ZF (или нулевой флаг), хотя руководство немного отличается в описаниях первого JE rel8 и JZ rel8 ZF использования, но в основном они тот же.

вот выдержка из руководства на страницах 464, 465 и 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).

Comments

    Ничего не найдено.