2009-01-22 16 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