間違っている場合は修正してください。
これは、JNZ
とCMP
に対する私の理解です。
JNZ
-Z
フラグがゼロでない場合、ジャンプが行われます(1)
CMP
-2つの値が等しい場合、Z
フラグが設定されます(1)、そうでない場合は設定されません(0)
これは私が見ているフラッシュチュートリアルです。シンプルなCrackMeのソリューションを教えています。
ご覧のとおり、前の命令はAL
と47h
を比較しました。それらは等しく、Z
フラグを設定しました。 (右側の[登録]ウィンドウで確認できます)
次の命令はJNZ
です。私の理解では、Z
フラグが設定されている場合、ジャンプが発生するということでした。 Z
フラグISが設定されていますが、ジャンプは行われません!
どうして?
JNZは「ゼロでない場合ジャンプ(ZF = 0)」、および[〜#〜] not [〜#〜]「ZFが設定されている場合ジャンプ」の略です。
覚えやすい場合は、JNZとJNE(等しくない場合はジャンプ)が同等であると考えてください。したがって、_cmp al, 47
およびAL
の内容が47に等しい場合、ZFが設定されます。ジャンプ(エルゴではない場合-JNE)を実行しないでください。
ここで少し広い回答をします。
一般的に、x86には2種類の条件付きジャンプがあります。
算術ジャンプ-JZ(ゼロの場合はジャンプ)、JC(キャリーの場合はジャンプ)、JNC(キャリーの場合はジャンプ)など.
比較ジャンプ-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
最初は、ゼロフラグが1 /セットの場合のジャンプのように、JNZがゼロ(0)ではない場合のジャンプを意味するように見えます。
しかし実際には、ゼロ(設定されている)ではなくジャンプ(ある場合)を意味します。
0 =設定されておらず、1 =設定されている場合は、次のことを覚えておいてください。
JNZは、ゼロフラグが設定されていない場合にジャンプします(0)
JNZ Jump if Not Zero ZF=0
確かに、これは紛らわしい権利です。
わかりやすくするために、非ゼロを未設定に置き換えます。 (これはあなた自身の理解のためであることに注意してください)
したがって、
JNZ Jump if Not Set ZF=0
未設定とは、フラグZ = 0を意味します。そのため、ジャンプ(未設定の場合はジャンプ)
セットはフラグZ = 1を意味します。したがって、ジャンプしないでください