x86:ZF并不总是由AND更新?

时间:2009-01-22 15:19:18

标签: assembly x86

我在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生成的,那么我正在执行数据。

提前谢谢。

4 个答案:

答案 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)

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