2014-10-02 48 views
1

所以我只是試圖在這個簡單的程序中用gdb訪問eax(Assembly newbie)無法從GDB訪問x86-64中的32位寄存器

C代碼:

int main(){ 
    int a = 1; 
    int b = 3; 
    int c = a + b; 
    return 1; 
} 

這裏是我的gdb的嘗試:

(gdb) disas 
Dump of assembler code for function main: 
0x000000000040049c <+0>: push %rbp 
0x000000000040049d <+1>: mov %rsp,%rbp 
0x00000000004004a0 <+4>: movl $0x1,-0x4(%rbp) 
0x00000000004004a7 <+11>: movl $0x3,-0x8(%rbp) 
0x00000000004004ae <+18>: mov -0x8(%rbp),%eax 
0x00000000004004b1 <+21>: mov -0x4(%rbp),%edx 
=> 0x00000000004004b4 <+24>: add %edx,%eax 
0x00000000004004b6 <+26>: mov %eax,-0xc(%rbp) 
0x00000000004004b9 <+29>: pop %rbp 
0x00000000004004ba <+30>: retq 
End of assembler dump. 

(gdb) x $rbp 
0x7fffffffe620: 0x00000000 
(gdb) x $rbp-4 
0x7fffffffe61c: 0x00000001 
(gdb) x $rbp-8 
0x7fffffffe618: 0x00000003 
(gdb) x $eax 
0x3: Cannot access memory at address 0x3 

所以你可以看到,我一直在使用x $rbp訪問rbp沒有問題,但我無法訪問eax

是否有一些設置需要打開以從64位系統上的gdb訪問32位寄存器?

+2

嘗試'p $ rbp'和'p $ eax'來代替...(並且執行「help x」和「help p」來了解這些命令之間的差異) – Nemo 2014-10-02 03:48:11

回答

3

x命令代表examine。它接受一個指針作爲輸入並顯示那裏的內容。您正在查找print命令或p,該命令輸出參數的值。

p $eax 

通過做x $rbp,你實際上看着什麼在堆棧上。看起來rbp在你的例子中包含地址0x7fffffffe620

您得到的錯誤消息x $eax表示eax的值爲3,並且由於這不是有效的指針,所以它會顯示錯誤消息。

+0

嗨,謝謝你的迴應。因此,如果x接受一個指針作爲輸入,爲什麼我會輸入'x $ eax'和'x $ rax'之間會有什麼區別?我可以訪問$ rax,但是我無法訪問$ eax,並且我會假設它們都是指針,或者都是非指針。 – user49404 2014-10-02 03:54:22

+0

您沒有顯示'$ rax',但我會假設'$ rax'的高位使它成爲一個有效的指針,而低位本身並不指向任何有用的位置。通過執行'x $ eax',你丟棄了地址的上半部分(假設它是一個地址)。 – zneak 2014-10-02 04:00:28

+0

換句話說,你不能假設'eax'是'rax'的基礎上的有效指針,因爲'eax'只不過是'rax'的低32位。它是指針大小的一半。舉一個更明顯的例子,'al'是'rax'的低8位,但是你(可能)不會把它當作指針。 – zneak 2014-10-02 04:09:07

-1

chutiye ...負正負的價值是什麼。那許多位,你需要添加內存....

** 0x000000000040049d < + 1>:MOV%RSP,RBP%

0x00000000004004a0 < +4>:MOVL $ 0x1,則-0x4(%RBP)

0x00000000004004a7 < +11>:MOVL $ 0x3,錯誤就在這裏,因爲你不能直接添加一個字符串下一存儲指令0x8中(%rbp)**

+0

您試圖將內存中字符串的值乘以8位.... – ciph3r 2016-11-18 12:46:34

+0

看起來像正常的AT&T語法從'gcc -O0'給我的未優化的編譯器輸出。您展示的任何說明中沒有任何字符串或附加內容。 – 2016-11-19 00:54:24