28

私が間違っている場合は私を訂正してください。

JNZこれは私の理解ですCMP

JNZZ-フラグがゼロでない場合、ジャンプが発生します(1)

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

オリーDBG

これは私が見ているフラッシュチュートリアルです。単純なCrackMeの解決策を教えています。

ご覧のとおり、前の命令は。と比較さALれてい47hます。それらは等しく、Z旗を立てました。(右側の[レジスタ]ウィンドウで確認できます)

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

なんで?

4

5 に答える 5

41

JNZは、「ゼロでない場合はジャンプ(ZF = 0)」の略であり、「ZFが設定されている場合はジャンプ」の略ではありません

覚えやすい場合は、JNZとJNE(等しくない場合はジャンプ)が同等であると考えてください。したがって、あなたがやっていてcmp al, 47、の内容がAL47に等しいとき、ZFが設定され、エルゴジャンプ(等しくない場合-JNE)は取られるべきではありません。

于 2013-02-12T20:40:14.483 に答える
26

ここでもう少し広い答えをします。

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 
于 2013-02-12T21:26:38.593 に答える
3

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

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

0 =未設定、1 =設定の場合は、次の点に注意してください。
ゼロフラグが設定されていない場合、JNZはジャンプします(0)

于 2013-02-12T23:14:01.757 に答える
0
JNZ     Jump if Not Zero    ZF=0

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

理解しやすくするために、NotZeroをNotSetに置き換えください。(これはあなた自身の理解のためであることに注意してください)

したがって、

JNZ     Jump if Not Set     ZF=0

設定されていないということは、フラグZ = 0を意味します。したがって、ジャンプ(設定されていない場合はジャンプ)

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

于 2017-05-26T03:37:29.280 に答える
0

JNE/Zは*と読むことができます

E qual / Zeroフラグでステータスが「未設定」の場合はジャンプします

「未設定」は、CPUの「等しい/ゼロフラグ」が0に設定されている場合のステータスであり、条件が満たされているか、等しく一致している場合にのみ発生します。

于 2020-10-18T13:49:49.883 に答える