web-dev-qa-db-ja.com

JE / JNEとJZ / JNZの違い

X86アセンブリコードでは、JEおよびJNEJZおよびJNZとまったく同じですか?

74
QuasarDonkey

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

(同様に、JNEJNZは、ZFが0に等しい場合の条件付きジャンプの単なる異なる名前です。)

couldそれらを同じ意味で使用しますが、shouldあなたがしていることに応じてそれらを使用します:

  • 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を取得します。しないでください。)

104

Intelのマニュアル-命令セットリファレンス から、JEJZのオペコードは同じです(rel8の場合は74、rel 16の場合は0F 84 32)JNEおよびJNZ(rel8の場合は75/rel 16/32の場合は0F 85)もオペコードを共有します。

JEJZは両方ともZF(またはゼロフラグ)をチェックしますが、マニュアルは最初のJE rel8とJZの説明が少し異なりますrel8 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).
34
higuaro