我在x86上调试我的代码,问题跟踪到AND指令 如果结果不为零,有时不会清除ZF标志。 这是一段有问题的代码:
0257A9F9 mov edx,dword ptr [ecx+18h] 0257A9FC and edx,80000h 0257AA02 int 3 0257AA03 je 0257AA2A
我在AND之后添加了一个断点用于调试。 当它在断点EDX == 0x80000和ZF == 1时停止。 但是如果EDX!= 0,则应清除ZF。 单步执行调试器时代码工作正常, 但在正常运行期间它会一直失败。
这是screenshot调试器会话。
任何提示?
如果重要的是代码是由JIT生成的,那么我正在执行数据。
提前谢谢。
答案 0 :(得分:4)
谢谢大家。 这是我的错,很抱歉打扰你。 从另一个地方到'int 3'有一个分支。 这就是为什么标志与'int 3'之前的指令不一致的原因。 此时总是有edx == 0x80000让我很困惑。 对不起。
答案 1 :(得分:2)
你可以很容易地检查int 3处理程序,看看它是否以iret
返回(即弹回调用者标志),或者它是否以retf 2
返回(即保留处理程序中的标志)
答案 2 :(得分:1)
根据Intel指令集参考,始终根据结果设置ZF。 int 3处理程序中的某些东西可能会操纵它吗?
编辑:在进一步深入阅读手册之后(感谢上帝为英特尔发送免费副本!),我唯一的想法是,无论是以某种方式设置它的int 3处理程序,还是处理器在设置时仅查看dx而不是edx标志。两者似乎都不太可能,但后者似乎完全不可信。你在运行什么模式? (真实的,受保护的,不真实的,长的?)
答案 3 :(得分:0)
可能是您的调试器正在做一些特殊的事情,例如同步内存和寄存器。当你在没有调试器的情况下运行它时它会失败吗?