本文目的
之前从其他地方看到过,调用函数时,会把下一条指令地址入栈,再把函数入栈,形参从右到左入栈,出栈顺序相反。但是自己一直也没有观察过。所以本文在gcc5.4下,通过GDB调试,把函数调用时的汇编指令的执行,以及相应寄存器的变换展示出来。这样不光对函数调用的细节更清楚,也能熟悉GDB调试的一些功能。ps:本文调试图片较多。
测试代码
1 #include<stdio.h>
2
3 class A {
4 public:
5 int f;
6 int s;
7 };
8
9 int sum(int l,int r)
10 {
11 int res =0;
12 res = l+r;
13 return res;
14 }
15 int main ()
16 {
17 A a;
18 a.f = 0x55;
19 a.s = 0x66;
20 int res = sum(a.f,a.s);
21 printf("sum: %d",res);
22 return 0;
23 }
汇编代码
NOTICE:
编译环境: gcc 5.4.0 x86_64
编译加上-g 选项,不加优化。
先使用objdump查看汇编代码,一会gdb调试时还会看到,但只能看到要执行的几行,所以这里先把整体需要的贴出来。
0000000000400526 <sum(int, int)>:
int f;
int s;
};
int sum(