JE / JNEとJZ / JNZの違い


88

x86のアセンブリコードでは、あるJEJNEまったく同じJZJNZ


59
長い答え:はい。
ハンスパッサント2013年

9
簡単な答え:いいえ。(ただし、これらはまったく同じマシンコードに対応しているため、まったく同じことを行います。同じ比較のためにニーモニックが異なるだけです。)

4
JEは、等しい場合はジャンプを意味し、前の比較でzフラグが設定されている場合は等しい、JZは、zフラグが設定されている場合はジャンプを意味します。それらはまったく同じであり、私の比較が等しいか等しくないという観点から考えたり書いたりしたい人もいます。一部の人々は、zフラグセットまたはzフラグクリアの観点から考えて書いています。
old_timer 2013年

回答:


124

JEJZはまったく同じものの単なる異なる名前です。ZF(「ゼロ」フラグ)が1に等しい場合の条件付きジャンプです。

(同様にJNEJNZZF0に等しい場合の条件付きジャンプの名前が異なります。)

あなたは可能性があり、交換可能にそれらを使用しますが、必要がある、あなたが何をしているかに応じて、それらを使用します:

  • JZ/JNZゼロに等しいものを明示的にテストする場合は、より適切です。

    dec  ecx
    jz   counter_is_now_zero
    
  • JEそしてJNE後の方が適していCMP命令:

    cmp  edx, 42
    je   the_answer_is_42
    

    CMP命令は減算を実行し、フラグを保持したまま結果の値を破棄します。これがZF=1、オペランドが等しい場合と等しくない場合に得られる理由ですZF=0。)


2
TL:DR:同じマシン操作、異なるセマンティックな意味。同じようにjb/ jc/jnaeすべてのテストCF = 1。参照してくださいfelixcloutier.com/x86/jcc(またはcmovccまたはsetcc)
ピーター・コルド

36

以下からの命令セット・リファレンス- IntelのマニュアルJEおよびJZ(同じオペコード持っ74rel8用/0F 84またREL 16/32用)を JNEJNZ75rel8用/ 0F 85REL用16/32)株式オペコード。

JEそしてJZ、それらのチェックの両方ZF(又はゼロフラグ)、手動異なるがわずかに最初の記述でJErel8とJZrel8ZF使用するが、基本的には同じです。

これは、マニュアルの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).

-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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.