(汇编新手)无法从GDB访问x86-64中的32位寄存器

时间:2014-10-02 03:46:08

标签: assembly gdb x86-64

所以我只想尝试在这个简单的程序中使用gdb访问eax

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 个答案:

答案 0 :(得分:3)

x命令代表examine。它接受一个指针作为输入并显示其中的内容。您正在寻找print命令,或p,它会打印其参数的值。

p $eax

通过x $rbp,您实际上正在查看堆栈上的内容。 rbp似乎包含您示例中的地址0x7fffffffe620

您执行的错误消息x $eax表示eax的值为3,并且因为它不是有效指针,它会显示错误消息。

答案 1 :(得分:-1)

chutiye ...减去加减去什么是值..你需要添加多少内存....

** 0x000000000040049d&lt; + 1&gt;:mov%rsp,%rbp

0x00000000004004a0&lt; + 4&gt;:movl $ 0x1,-0x4(%rbp)

0x00000000004004a7&lt; + 11&gt;:movl $ 0x3,错误在这里因为你不能直接将字符串添加到下一个内存指令-0x8(%rbp)**