我目前正在研究gdb反汇编,以帮助我了解有关c程序的更多细节,所以我写了一个c程序:
#include <stdio.h>
void swap(int a, int b){
int temp = a;
a = b;
b = temp;
}
void main(){
int a = 1,b = 2;
swap(a, b);
}
我使用gdb并运行disass /m main
来获取这些:
(gdb) disass /m main
Dump of assembler code for function main:
8 void main(){
0x0000000000400492 <+0>: push %rbp
0x0000000000400493 <+1>: mov %rsp,%rbp
0x0000000000400496 <+4>: sub $0x10,%rsp
9 int a = 1,b = 2;
0x000000000040049a <+8>: movl $0x1,-0x8(%rbp)
0x00000000004004a1 <+15>: movl $0x2,-0x4(%rbp)
10 swap(a, b);
0x00000000004004a8 <+22>: mov -0x4(%rbp),%edx
0x00000000004004ab <+25>: mov -0x8(%rbp),%eax
0x00000000004004ae <+28>: mov %edx,%esi
0x00000000004004b0 <+30>: mov %eax,%edi
0x00000000004004b2 <+32>: callq 0x400474 <swap>
11 }
0x00000000004004b7 <+37>: leaveq
0x00000000004004b8 <+38>: retq
End of assembler dump.
-0x8(%rbp)
意味着什么?存储器还是寄存器?
我知道1存储在-0x8(%rbp)
中,2存储在-0x4(%rbp)
中,如何显示值
有点像地方&#39; ?
我尝试使用(gdb) p -0x8(%rbp)
,但得到这个:
A syntax error in expression, near `%rbp)'.
答案 0 :(得分:3)
gdb中的注册表可以使用前缀&#39; $&#39;
p *(int *)($rbp - 8)
RBP和RSP很可能是指内存位置,特别是堆栈。其他寄存器或多或少是通用目标寄存器,也可以指向存储器。
答案 1 :(得分:2)
这意味着&#34;从rbp&#34;中存储的地址中减去8时存储的数据。尝试查看gdb中可用的堆栈命令:http://www.delorie.com/gnu/docs/gdb/gdb_41.html
答案 2 :(得分:2)
-0x8(%rbp)
等结构的实际含义取决于体系结构(或汇编语言)。但在这种情况下,-0x8(%rbp)
是一个内存地址,可能是%rbp
减去8的值。
在gdb中,您可以通过执行类似
的操作来打印这些内存地址的值info r rbp
p *(int *)(value_of_rbp - 8)