Różnica między JE / JNE i JZ / JNZ


89

W kodzie asemblera x86 są JEi są JNEdokładnie takie same jak JZi JNZ?


59
Długa odpowiedź: tak.
Hans Passant,

9
Krótka odpowiedź: nie. (Ale odpowiadają one dokładnie temu samemu kodowi maszynowemu, więc robią dokładnie to samo. Mają tylko różne mnemoniki dla tego samego porównania.)

4
JE oznacza skok, jeśli jest równy, jest równy, jeśli poprzednie porównanie ma ustawioną flagę z, JZ oznacza skok, jeśli flaga z jest ustawiona. Są dokładnie takie same, niektórzy ludzie chcą myśleć / pisać, aby moje porównanie było równe lub nierówne. Niektórzy ludzie myślą i piszą w kategoriach czy flaga z jest ustawiona lub flaga z jest czysta.
old_timer,

Odpowiedzi:


125

JEi JZsą po prostu różnymi nazwami dla dokładnie tego samego: skok warunkowy, gdy ZF(flaga „zero”) jest równa 1.

(Podobnie, JNEi JNZto tylko różne nazwy dla skoku warunkowego, gdy ZFjest równa 0.)

Państwo mogli używać ich zamiennie, ale należy z nich korzystać w zależności od tego, co robisz:

  • JZ/ JNZsą bardziej odpowiednie, gdy jawnie testujesz coś równego zero:

    dec  ecx
    jz   counter_is_now_zero
    
  • JEi JNEsą bardziej odpowiednie po CMPinstrukcji:

    cmp  edx, 42
    je   the_answer_is_42
    

    ( CMPInstrukcja wykonuje odejmowanie i odrzuca wartość wyniku, zachowując flagi; dlatego otrzymujesz, ZF=1gdy operandy są równe, a ZF=0kiedy nie).


2
TL: DR: ta sama operacja maszyny, inne znaczenie semantyczne . Tak jak jb/ jc/ jnaewszystkie testy CF = 1. Zobacz felixcloutier.com/x86/jcc (lub cmovcc lub setcc)
Peter Cordes,

36

Z podręcznika Intela - Odniesienie do zestawu instrukcji , JEi JZmają ten sam kod 74operacji ( dla rel8 / 0F 84dla rel 16/32), JNEa także JNZ( 75dla rel8 / 0F 85dla rel 16/32) współdzielą kody operacyjne.

JEi JZoba sprawdzają ZFflagę (lub zero), chociaż podręcznik różni się nieco w opisach pierwszego JEużycia rel8 i JZrel8 ZF, ale w zasadzie są takie same.

Oto wyciąg ze stron podręcznika 464, 465 i 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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.