Різниця між JE / JNE та JZ / JNZ


88

У коді збірки x86 є JEі JNEточно такі ж, як JZі JNZ?


59
Довга відповідь: так.
Ганс Пассант,

9
Коротка відповідь: ні. (Але вони відповідають точно одному і тому ж машинному коду, тому роблять абсолютно одне і те ж. Вони просто мають різні мнемотехніки для одного і того ж порівняння.)

4
JE означає стрибок, якщо рівний, він дорівнює, якщо попереднє порівняння має встановлений прапор z, JZ означає стрибок, якщо встановлений прапор z. Вони абсолютно однакові, деякі люди хочуть думати / писати з точки зору мого порівняння було рівним чи не рівним. Деякі люди думають і пишуть з точки зору: чи встановлений прапор z або чи прапор z.
old_timer

Відповіді:


124

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коли ні.)


2
TL: DR: однакова робота машини, різне семантичне значення. Так само, як jb/ jc/ jnaeвсі тестування CF = 1. Дивіться felixcloutier.com/x86/jcc (або cmovcc або setcc)
Пітер Кордес

36

Від керівництва компанії 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).

-5
  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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.