7

x86 でコードをデバッグしていますが、結果がゼロでない場合、AND 命令で ZF フラグがクリアされないことがあります。問題のあるコードは次のとおりです。

0257A9F9 mov edx,dword ptr [ecx+18h]
0257A9FC と edx,80000h
0257AA02 整数 3    
0257AA03 ジェ 0257AA2A

デバッグ用に AND の後にブレークポイントを追加しました。ブレークポイント EDX==0x80000 および ZF==1 で停止した場合。ただし、EDX!=0 の場合は ZF をクリアする必要があります。デバッガーでシングルステップを実行すると、コードは完全に正常に動作しますが、通常の実行中は一貫して失敗します。

これは、デバッガー セッションのスクリーンショットです。

ヒントはありますか?

それが問題であれば、コードは JIT によって生成されるので、データを実行しています。

前もって感謝します。

4

4 に答える 4

4

みんな、ありがとう。私のせいでした、お手数をおかけして申し訳ありません。別の場所から「int 3」への分岐があります。そのため、フラグは「int 3」より前の命令と矛盾しています。この時点で常に edx==0x80000 を持っていることに混乱しました。またすみません。

于 2009-01-22T15:45:23.063 に答える
2

int 3 ハンドラーを簡単に調べて、それが a で返されるかiret(つまり、呼び出し元のフラグをポップバックする)、またはで返されるかretf 2(つまり、ハンドラーからのフラグを保持するか) を確認できます。

于 2009-01-22T15:27:34.410 に答える
1

Intel 命令セット リファレンスによると、ZF は常に結果に従って設定されます。int 3 ハンドラの何かがこれを操作している可能性はありますか?

編集:マニュアルをさらに掘り下げた後(Intelが無料コピーを送信してくれてありがとう!)、私の唯一の考えは、int 3ハンドラーが何らかの形でそれを設定しているか、フラグを設定するときにプロセッサーがedxではなくdxのみを見ているということです。どちらもありそうにないように見えますが、後者は完全に信じがたいようです。どのモードで実行していますか? (リアル、プロテクト、アンリアル、ロング?)

于 2009-01-22T15:23:25.900 に答える
0

メモリとレジスタの同期など、デバッガが特別なことを行っている可能性があります。デバッガーなしで実行すると、失敗しますか?

于 2009-01-22T15:30:06.697 に答える