簡體   English   中英

x86組件-CMP無法正確設置零標志

[英]x86 assembly - CMP not setting zero flag correctly

我在調試時遇到了這個比較:

| 38 19 | CMP BYTE PTR DS:[ECX], BL

我在上面設置了一個斷點,並看到了這一點( 十六進制中的值):

ECX = 00838430
BYTE PTR[ECX]=[00838430]=55
EBX = 00000055 (BL = 55)
EFLAGS = 00000314 (CF=0 OF=0 SF=0 ZF=0 AF=1 PF=1)

因此,我希望在執行此比較后將置零標志,因為ECX和BL指向的字節相等。 但是,發生的是,設置了溢出標志並且ZF保持為0。

EFLAGS = 00000A06 (CF=0 OF=1 SF=0 ZF=0 AF=0 PF=1)

為什么會這樣呢? 它與有符號/無符號整數有關嗎? 我認為CMP是不可知論的,也就是說,將比較結果解釋為有符號/無符號是以下分支指令(例如JG vs JA)要做的事情。 比較之后是一個JNE,因為ZF = 0並導致不正確的結果,因此采取了JNE。

我懷疑調試器中存在某種錯誤,因此我嘗試了另一個錯誤(OllyDbg v2),發現我發布的值確實正確,內存和BL中存在55個錯誤。 但是,在Olly下運行時,CMP的行為正常,如預期的那樣,即設置了ZF並且未執行跳轉。

所以代碼實際上按預期工作,問題出在調試器上。 當代碼不在調試器下運行時,它也可以正常工作。 對於此特定代碼,在沒有調試器的情況下測試正確性會有些困難且耗時,這就是為什么到目前為止我從未在沒有調試器的情況下對其進行測試。 該錯誤不帶有斷點或單步執行,因為它在運行時均無法正常運行。

帶有錯誤的調試器是x64dbg(盡管有名稱,但它不僅適用於64位)。 我的構建已經有些過時了,也許該錯誤已在最新快照中修復。

謝謝大家的評論。


它實際上是用戶錯誤,而不是調試器中的錯誤。 我在00838430處設置了一個INT3斷點,或者我暫時忘記了軟件斷點的工作方式。 無論如何,在這種情況下,內存的實際內容為0xCC,但調試器顯示了原始字節。 因此,CMP的行為與應有的行為完全相同。 Ped7g從第一個評論中是正確的,我應該仔細檢查內存內容。 使用另一個調試器進行的第二項測試僅能正常工作,因為當時我沒有在00838430上設置斷點。

http://i.imgur.com/iWKad22.jpg

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM