В коде сборки x86 есть JE
и JNE
точно такие же, как JZ
и JNZ
?
Разница между JE/JNE и JZ/JNZ
Ответ 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>