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).
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).
Odpowiedzi:
JE
iJZ
są po prostu różnymi nazwami dla dokładnie tego samego: skok warunkowy, gdyZF
(flaga „zero”) jest równa 1.(Podobnie,
JNE
iJNZ
to tylko różne nazwy dla skoku warunkowego, gdyZF
jest 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
/JNZ
są bardziej odpowiednie, gdy jawnie testujesz coś równego zero:JE
iJNE
są bardziej odpowiednie poCMP
instrukcji:(
CMP
Instrukcja wykonuje odejmowanie i odrzuca wartość wyniku, zachowując flagi; dlatego otrzymujesz,ZF=1
gdy operandy są równe, aZF=0
kiedy nie).źródło
jb
/jc
/jnae
wszystkie testy CF = 1. Zobacz felixcloutier.com/x86/jcc (lub cmovcc lub setcc)Z podręcznika Intela - Odniesienie do zestawu instrukcji ,
JE
iJZ
mają ten sam kod74
operacji ( dla rel8 /0F 84
dla rel 16/32),JNE
a takżeJNZ
(75
dla rel8 /0F 85
dla rel 16/32) współdzielą kody operacyjne.JE
iJZ
oba sprawdzająZF
flagę (lub zero), chociaż podręcznik różni się nieco w opisach pierwszegoJE
użycia rel8 iJZ
rel8ZF
, ale w zasadzie są takie same.Oto wyciąg ze stron podręcznika 464, 465 i 467.
źródło
źródło