2009-01-22 17 views
7

我在x86上调试我的代码,并且问题跟踪到AND指令 如果结果不为零,有时不会清除ZF标志。 这里是有问题的代码:x86:ZF不总是用AND更新?

 
0257A9F9 mov   edx,dword ptr [ecx+18h] 
0257A9FC and   edx,80000h 
0257AA02 int   3  
0257AA03 je   0257AA2A 

我添加了一个断点后进行调试。 当它在断点EDX == 0x80000和ZF == 1处停止时。 但是如果EDX!= 0,ZF应该被清除。 当单步进入调试器时,代码工作得很好, 但在正常运行期间它一直失败。

这里是调试器会话的screenshot

任何提示?

如果事情的代码是由JIT生成的,那么我正在执行数据。

预先感谢您。

回答

1

根据英特尔指令集引用,ZF总是根据结果设置。 int 3处理函数中的某些东西是否可以操纵它?

编辑:在进一步深入了解手册(感谢上帝让英特尔发送免费副本!)后,我唯一的想法是它是以int 3处理程序设置它,或者处理器只是在查看dx而不是edx时设置标志。两者似乎都不太可能,但后者似乎完全不合情理。你跑什么模式? (真实的,受保护的,虚幻的,长的?)

2

你可以很容易地检查int 3处理程序,看看它是否返回iret(即回弹调用者标志)或者是否返回retf 2(即保留处理程序)。

0

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

4

谢谢大家。 这是我的错,很抱歉打扰你。 从另一个地方有一个'int 3'分支。 这就是为什么标志与'int 3'之前的指令不一致的原因。 在这一点上,我总是被edx == 0x80000弄糊涂了。 对不起。

+0

不需要道歉,我们一直在那里:) – 2009-01-22 15:46:49