JE / JNE ve JZ / JNZ arasındaki fark


92

86 derleme kodunda, vardır JEve JNEtam olarak aynı JZve JNZ?


60
Uzun cevap: evet.
Hans Passant

9
Kısa cevap: hayır. (Ama tam olarak aynı makine koduna karşılık geliyorlar , bu yüzden tamamen aynı şeyi yapıyorlar. Aynı karşılaştırma için farklı anımsatıcılara sahipler.)

4
JE eşitse atlama anlamına gelir, önceki karşılaştırmada z bayrağı ayarlanmışsa eşittir, z bayrağı ayarlanmışsa JZ atlama anlamına gelir. Tam olarak aynı, bazı insanlar benim karşılaştırmam eşit ya da eşit değildi açısından düşünmek / yazmak istiyor. Bazı insanlar z bayrağının ayarlandığını veya z bayrağının açık olduğunu düşünüyor ve yazıyor.
old_timer

Yanıtlar:


127

JEve JZtamamen aynı şey için farklı isimlerdir: ZF("sıfır" bayrağı) 1'e eşit olduğunda koşullu bir sıçrama .

(Benzer şekilde JNEve 0'a eşit JNZolduğunda koşullu sıçrama için farklı isimlerdir. ZF)

Sen olabilir birbirinin yerine kullanabilirsiniz, ancak gerektiğini ne yaptığınızı bağlı bunları kullanmak:

  • JZ/ JNZaçıkça sıfıra eşit olan bir şeyi test ettiğinizde daha uygundur:

    dec  ecx
    jz   counter_is_now_zero
    
  • JEve JNEbir CMPtalimattan sonra daha uygundur :

    cmp  edx, 42
    je   the_answer_is_42
    

    (Bir CMPkomut bir çıkarma işlemi gerçekleştirir ve bayrakları korurken sonucun değerini atar; bu nedenle ZF=1işlenenler eşit ZF=0olduğunda ve olmadıklarında elde edersiniz .)


2
TL: DR: aynı makine işlemi, farklı anlamsal anlam. Tıpkı jb/ jc/ jnaeall test CF = 1 gibi. Bkz. Felixcloutier.com/x86/jcc (veya cmovcc veya setcc)
Peter Cordes

36

Gönderen Öğretim Seti Referans - Intel'in manuel , JEve JZ(aynı işlem kodunu sahip 74REL8 için / 0F 84de rel 16/32 için) JNEve JNZ( 75REL8 için / 0F 85rel için 16/32) hisse işlem kodları.

JEve JZher ikisi de ZF(veya sıfır bayrağını) kontrol etse de, kılavuz ilk JErel8 ve JZrel8'in açıklamalarında biraz farklılık gösterir.ZF kullanımının , ancak temelde .

İşte kılavuzun 464, 465 ve 467 sayfalarından bir alıntı.

 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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.