2013-01-10 10 views
54

x86アセンブリコードでは、JEJNEJZJNZとまったく同じですか?JE/JNEとJZ/JNZの相違

+38

長い答え:はい。 –

+6

短い答え:いいえ。 (しかし、それらは同じマシンコードに正確に対応しているので、同じことを*正確には同じものにします) –

+3

JEは、等しい場合にジャンプし、先行比較にはzフラグが設定されている場合、JZはジャンプを意味します。彼らはまったく同じです、いくつかの人々は私の比較の点で考える/書くことが同じかどうか等しいと思ってほしい。いくつかの人々は考えるとzのフラグセットまたはzフラグがクリアされているという点で書いています。 –

答えて

75

JEJZが正確に同じもののためにわずかに異なる名前である: 条件ジャンプZF(「ゼロ」フラグ)1

に等しい場合(同様に、JNEJNZのためだけ異なる名前でありますZFが0に等しい条件ジャンプ )

あなた同義的にそれらを使用することができますが、あなた 012に応じて、それらを使用する必要がありますあなたが明示的に何かがゼロに等しいため をテストしているとき

  • JZ/JNZがより適切です:

    dec ecx 
    jz counter_is_now_zero 
    
  • JEJNECMP命令の後に、より適切であるあなたは何をしているか:

    cmp edx, 42 
    je the_answer_is_42 
    

    (A CMP命令は減算を実行し、フラグを保持したまま結果の値をスローします。これは、彼らがいないときのオペランドが とZF=0等しいときにZF=1を得る理由です。)

30
Intel's manual - Instruction Set Referenceから

JEJZは同じオペコードを持っている(74 rel8用/ REL 16 0F 84/32)また、JNEおよびJNZ(rel16/rel32の場合は75がrel16/32の場合rel8/0F 85)のオペコードを共有します。

JEJZマニュアル第JE rel8とJZ rel8 ZF使用の説明においてわずかに異なるが、基本的にはそれらは同じであるが、それらは両方とも、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). 
関連する問題