2013-11-02 57 views
1

我第一次學習Assembly Lang。這裏是(gdb)反彙編的一部分:

mov $0x131,%eax 
cmp 0x8(%rsp),%eax //Question here, what is the value of 0x8(%rsp)? 




(gdb)i r 
rax   0x131 305 
rbx   0x7fffffffe578 140737488348536 
rcx   0x20  32 
rdx   0x7fffffffe478 140737488348280 
rsi   0x0  0 
rdi   0x1999999999999999  1844674407370955161 
rbp   0x0  0x0 
rsp   0x7fffffffe470 0x7fffffffe470 
r8    0x37ed3bb080  240203313280 
r9    0x0  0 
r10   0x1e  30 
r11   0x0  0 
r12   0x400cb0 4197552 
r13   0x7fffffffe570 140737488348528 
r14   0x0  0 
r15   0x0  0 
rip   0x400fd9 0x400fd9 <phase_3+129> 
eflags   0x212 [ AF IF ] 
cs    0x33  51 
ss    0x2b  43 
ds    0x0  0 
es    0x0  0 
fs    0x0  0 

我很難搞清楚它比較什麼。 0x8(%rsp)的值是多少?

(我知道這個問題聽起來愚蠢)

在此先感謝

= - ==========

最後我通過

(gdb) p /x *(int *)($rsp+0x8) 
解決

在這篇文章的幫助下How to print -0x4(%rbp) in gdb?

Zack的答案應該是鑽機HT,但它不工作,因爲我使用的是64位操作系統。

回答

4

括號通常表示解除引用。 0x8(%rsp)的意思是「從堆棧指針%rsp獲取距離堆棧8個字節的位置,然後取該地址的值。」
它將0x131移入%eax,然後將其與該位置的數據進行比較。 CMP設置eflags寄存器取決於比較(如零標誌如果操作數相等,等)
要看到的是,在使用GDB地址,類型

(gdb) x/1dw 0x8(%esp) 

此命令的「x」檢查存儲器。
1表示檢查1指定的任何單位。
「d」表示以十進制表示法輸出(與十六進制相反)。我不知道你在比較什麼類型的數據,所以你可以使用「c」來獲得一個字符,或者「x」來獲得一個十六進制,或者「s」作爲一個字符串,或者其他任何東西。
「w」提供單位,在這種情況下是一個單詞,它是4個字節。
因此,此命令查看給定地址0x8(%rsp)處的4個字節,並以十進制格式打印任何內容。
要了解有關使用GDB查看內存如何變化的更多信息,請參閱this document.

+0

謝謝,你知道如何在gdb中顯示該值嗎? –

+1

對於我的64位操作系統,(gdb)p/x *(int *)($ rsp + 0x8)適用於我。 x/1dw 0x8(%esp)將在64位操作系統中導致語法錯誤。無論如何,你的回答非常有幫助,非常感謝。 –

0

因爲程序通過減去堆棧指針來分配一些堆棧內存。現在,當它想要使用分配的堆棧內存時,它們需要使用偏移來解引用。