Red*_*and 6 c gcc gdb disassembly
我目前正在研究 gdb 反汇编,以帮助我了解有关 c 程序的更多细节,因此我编写了 ac 程序:
#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);
}
Run Code Online (Sandbox Code Playgroud)
我使用 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.
Run Code Online (Sandbox Code Playgroud)
-0x8(%rbp)
意味着什么?存储器还是寄存器?
我确实知道 1 存储在-0x8(%rbp)
2 中-0x4(%rbp)
,我如何显示这些“位置”中的值?我尝试使用(gdb) p -0x8(%rbp)
但得到这个:
A syntax error in expression, near `%rbp)'.
Run Code Online (Sandbox Code Playgroud)
gdb 中的寄存器可以用前缀“$”引用
p *(int *)($rbp - 8)
Run Code Online (Sandbox Code Playgroud)
RBP 和 RSP 最有可能指的是内存位置,特别是堆栈。其他寄存器或多或少是通用寄存器,也可以指向内存。