所以我只想尝试在这个简单的程序中使用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位寄存器?
答案 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)**