Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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, когда это не так.)

Ответ 2

В Руководство 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).

Ответ 3

  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>