В коде сборки 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>