2012-01-22 68 views
2

我正在使用gdb來檢查程序。在裝配中,代碼是這樣做的:x86 cmp操作碼,指針和內聯文字

cmp $0x5, %eax 

然而,當我檢查的%eax內容,我得到:\020\343\377\377\377\177當作爲字符串檢查。

\020\343\377\377\377\177與彙編中的$ 0x5相比如何?

+2

你是什麼意思「%eax的內容」?作爲字符串檢查? C寄存器不能包含任何有意義的字符串。 –

+3

這是一個非常寬泛的eax你到達那裏。 –

+0

通過調用如下所示的方式對其進行檢查:x/30s $ eax – darksky

回答

2

cmp,在這種情況下,將eax中的值與常數5進行比較。如果你認爲它實際上是一個指針,那麼eax指向的值不會與常數進行比較。

該比較由減法完成 - 在你的情況下,這意味着5從值在eax減去,和多個標誌(CF,OF,SF,ZF,AF,和PF,根據documentation)被設置適當。通常,cmp指令之後是某種類型的條件指令(通常是跳轉),根據比較結果執行不同的操作。

如果您告訴我們eax中的值,而不是將eax作爲指針進行解釋,那麼我可能會向您提供更多信息。您可以使用p $eaxinfo registers獲取gdb中的值eax

+0

運行p'$ eax'時,得到:6307568.很抱歉,'x/30s $ eax'和'p $ eax'有什麼區別? – darksky

+0

'p $ eax'顯示'eax'中的值。 'x/30s $ eax'使用'eax'作爲指針,取消引用它,並將結果顯示爲一個字符串。檢查gdb文檔中的'x'和'p'。 –

+0

只是爲了人們未來的參考,下面是它們的'gdb apropos':'x - 檢查內存:x/FMT ADDRESS','p - 表達EXP的打印值 – Will