У коді збірки 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(або нульовий прапорець), хоча посібник дещо відрізняється в описах першого використання JErel8 та JZrel8 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).