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


89

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


59
Длинный ответ: да.
Hans Passant

9
Короткий ответ: нет. (Но они соответствуют точно таким же машинный код, поэтому они делают точно то же самое , они просто разные мнемоники для того же сравнения.)

4
JE означает переход, если равен, он равен, если в предыдущем сравнении установлен флаг z, JZ означает переход, если установлен флаг z. Они точно такие же, некоторые люди хотят думать / писать в терминах моего сравнения, были равны или не равны. Некоторые думают и пишут в терминах установленного или снятого флага z.
old_timer

Ответы:


125

JEи JZпредставляют собой просто разные имена для одного и того же: условного перехода, когда 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
    

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


2
TL: DR: одна и та же машинная работа, другое смысловое значение. Так же , как jb/ jc/ jnaeвсе испытания CF = 1. См. Felixcloutier.com/x86/jcc (или cmovcc, или setcc)
Питер Кордес

36

От руководства компании Intel - Instruction Set Reference , то JEи JZимеют один и тот же код операции ( 74для rel8 / 0F 84для отн 16/32) также JNEи JNZ( 75для rel8 /0F 85 для отна 16/32) Доля Opcodes.

JEи JZони оба проверяют наличие ZF(или нулевого флага), хотя в руководстве немного отличаются описания первых JErel8 и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).

-5
  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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.