web-dev-qa-db-ja.com

JNZとCMPの組み立て手順

間違っている場合は修正してください。

これは、JNZCMPに対する私の理解です。

JNZ-Zフラグがゼロでない場合、ジャンプが行われます(1)

CMP-2つの値が等しい場合、Zフラグが設定されます(1)、そうでない場合は設定されません(0)

Olly DBG

これは私が見ているフラッシュチュートリアルです。シンプルなCrackMeのソリューションを教えています。

ご覧のとおり、前の命令はAL47hを比較しました。それらは等しく、Zフラグを設定しました。 (右側の[登録]ウィンドウで確認できます)

次の命令はJNZです。私の理解では、Zフラグが設定されている場合、ジャンプが発生するということでした。 ZフラグISが設定されていますが、ジャンプは行われません!

どうして?

22
43.52.4D.

JNZは「ゼロでない場合ジャンプ(ZF = 0)」、および[〜#〜] not [〜#〜]「ZFが設定されている場合ジャンプ」の略です。

覚えやすい場合は、JNZとJNE(等しくない場合はジャンプ)が同等であると考えてください。したがって、_cmp al, 47およびALの内容が47に等しい場合、ZFが設定されます。ジャンプ(エルゴではない場合-JNE)を実行しないでください。

32

ここで少し広い回答をします。

一般的に、x86には2種類の条件付きジャンプがあります。

  1. 算術ジャンプ-JZ(ゼロの場合はジャンプ)、JC(キャリーの場合はジャンプ)、JNC(キャリーの場合はジャンプ)など.

  2. 比較ジャンプ-JE(等しい場合ジャンプ)、JB(以下の場合ジャンプ)、JAE(上または等しい場合ジャンプ)など.

したがって、最初のタイプは算術命令または論理命令の後にのみ使用してください。

sub  eax, ebx
jnz  .result_is_not_zero 

and  ecx, edx
jz   .the_bit_is_not_set

2番目のグループは、CMPの指示の後にのみ使用してください。

cmp  eax, ebx
jne  .eax_is_not_equal_to_ebx

cmp  ecx, edx
ja   .ecx_is_above_than_edx

これにより、プログラムが読みやすくなり、混乱することがなくなります。

これらの指示は実際には同義語である場合があることに注意してください。 JZ == JE; JC == JB; JNC == JAEなど。完全な表は次のとおりです。ご覧のとおり、条件付きジャンプ命令は16個しかありませんが、ニーモニックは30個あります-より読みやすいソースコードを作成できるように提供されています。

Mnemonic        Condition tested  Description  

jo              OF = 1            overflow 
jno             OF = 0            not overflow 
jc, jb, jnae    CF = 1            carry / below / not above nor equal
jnc, jae, jnb   CF = 0            not carry / above or equal / not below
je, jz          ZF = 1            equal / zero
jne, jnz        ZF = 0            not equal / not zero
jbe, jna        CF or ZF = 1      below or equal / not above
ja, jnbe        CF and ZF = 0      above / not below or equal
js              SF = 1            sign 
jns             SF = 0            not sign 
jp, jpe         PF = 1            parity / parity even 
jnp, jpo        PF = 0            not parity / parity odd 
jl, jnge        SF xor OF = 1     less / not greater nor equal
jge, jnl        SF xor OF = 0     greater or equal / not less
jle, jng    (SF xor OF) or ZF = 1 less or equal / not greater
jg, jnle    (SF xor OF) or ZF = 0 greater / not less nor equal 
19
johnfound

最初は、ゼロフラグが1 /セットの場合のジャンプのように、JNZがゼロ(0)ではない場合のジャンプを意味するように見えます。

しかし実際には、ゼロ(設定されている)ではなくジャンプ(ある場合)を意味します。

0 =設定されておらず、1 =設定されている場合は、次のことを覚えておいてください。
JNZは、ゼロフラグが設定されていない場合にジャンプします(0)

2
43.52.4D.
JNZ     Jump if Not Zero    ZF=0

確かに、これは紛らわしい権利です。

わかりやすくするために、非ゼロ未設定に置き換えます。 (これはあなた自身の理解のためであることに注意してください)

したがって、

JNZ     Jump if Not Set     ZF=0

未設定とは、フラグZ = 0を意味します。そのため、ジャンプ(未設定の場合はジャンプ)

セットはフラグZ = 1を意味します。したがって、ジャンプしないでください

0