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 处理程序以查看它是否返回iret(即弹出调用者标志)或是否返回retf 2(即保留来自处理程序的标志)。

于 2009-01-22T15:27:34.410 回答
1

根据 Intel 指令集参考,ZF 总是根据结果设置。int 3 处理程序中的某些东西可以操纵这个吗?

编辑:在进一步挖掘手册之后(感谢上帝让英特尔发送了免费副本!),我唯一的想法是它要么是 int 3 处理程序以某种方式设置它,要么是处理器在设置标志时只查看 dx 而不是 edx。两者似乎都不太可能,但后者似乎完全不可信。你在什么模式下运行?(真实的、受保护的、不真实的、长的?)

于 2009-01-22T15:23:25.900 回答
0

可能是您的调试器正在做一些特殊的事情,例如同步内存和寄存器。当您在没有调试器的情况下运行它时,您会说它失败了吗?

于 2009-01-22T15:30:06.697 回答