2013-01-10 11 views
54

W kodzie montażu x86 są JE i JNE dokładnie takie same, jak JZ i JNZ?Różnica między JE/JNE i JZ/JNZ

+38

instrukcji Long Odpowiedź: Tak. –

+6

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

+3

JE oznacza skok, jeśli jest równy, jest równy, jeśli wcześniejszy ustawiona flaga z, JZ oznacza przeskok, jeśli ustawiona jest flaga z. Są dokładnie takie same, niektórzy ludzie chcą myśleć/pisać w kategoriach mojego porównania było równe lub nie równe. Niektórzy ludzie myślą i piszą w kategoriach "flaga flag" lub "flaga z". –

Odpowiedz

75

JE i JZ to tylko różne nazwy dla dokładnie to samo: a warunkowy skok gdy ZF (flaga „zero”) jest równy 1.

(Podobnie JNE i JNZ to tylko różne nazwy warunkowy skok gdy ZF jest równa 0.)

ty mogli używać ich zamiennie, ale powinny używać ich w zależności od co robisz:

  • JZ/JNZ są bardziej odpowiednie, kiedy są wyraźnie testując czegoś jest równa zeru:

    dec ecx 
    jz counter_is_now_zero 
    
  • JE i JNE są bardziej odpowiednie po instrukcji CMP :

    cmp edx, 42 
    je the_answer_is_42 
    

    (Instrukcja A CMP wykonuje odejmowanie i wyrzuca wartość wyniku, zachowując flagi; dlatego masz ZF=1 gdy argumenty są równe i ZF=0 gdy nie jesteś.)

30

Z Intel's manual - Instruction Set Reference The JE i JZ mają ten sam kod operacji (74 dla rel8/0F 84 dla rel 16/32) również dla opcji opcodes share JNE i JNZ (75 dla rel8/0F 85 dla rel 16/32).

JE i JZ oboje kontrolnego dla ZF (lub zero flag), chociaż instrukcja różni się nieznacznie w opisach pierwszej JE rel8 i JZ rel8 ZF użytkowania, ale w zasadzie są one takie same.

Oto fragment od strony 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).