浅析函数调用过程
一个函数到底是怎么调用的,返回值是如何返回的,这里面学问真的很多,让我们来小小的分析一下。。。。
我们看一个很简单的C代码,通过gdb调试来分析函数调用过程。
平台和工具:ubuntu12.04+gcc 4.6.3+GNU gdb 7.4-2012.04
cs.c:
图1
下面的数字代表main函数反编译的行号
1.帧指针ebp入栈
2.帧指针ebp指向当前栈指针esp
3.分配24(ox18)字节空间,所以esp下移24字节,如图1
4,5.局部变量a,b入栈,这里可以看到变量分配是按地址增大方向,所以虽然a先定义,但a的地址小,如图1
这里,你可能会问那C在哪呢?按地址增大方向,c应该在b的上面,说的很对,图1中
ebp-4是不是什么都没有,那就是c的所在地址,我们将在11行得到证明
6,7.将add的参数b入栈
8,9.将add的参数a入栈,如图1
10.调用add子程序,我们反编译add函数,图2
我们将验证图2的返回地址就是0x080483e7
给两函数添加断点(gdb) print &c$6 = (int *) 0xbffff0e4(gdb) print $ebp-4$7 = (void *) 0xbffff0e4(gdb) print /x *(int*)($ebp-4)$4 = 0x3(gdb) print c$5 = 3通过上面我们可以看出c的地址的确是$ebp-4,在本次实验中eax是函数的返回值
这个过程分析就over了.....