У коді збірки x86 є JE
і JNE
точно такі ж, як JZ
і JNZ
?
У коді збірки x86 є JE
і JNE
точно такі ж, як JZ
і JNZ
?
Відповіді:
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
коли ні.)
jb
/ jc
/ jnae
всі тестування CF = 1. Дивіться felixcloutier.com/x86/jcc (або cmovcc або setcc)
Від керівництва компанії Intel - Instruction Set Reference , то JE
і JZ
має один і той же код операції ( 74
для rel8 / 0F 84
для отна 16/32) також JNE
і JNZ
( 75
для rel8 / 0F 85
для отна 16/32) Частка Opcodes.
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).