首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

浅析函数调用历程

2012-08-28 
浅析函数调用过程一个函数到底是怎么调用的,返回是如何返回的,这里面学问真的很多,让我们来小小的分析一下

浅析函数调用过程

一个函数到底是怎么调用的,返回值是如何返回的,这里面学问真的很多,让我们来小小的分析一下。。。。

我们看一个很简单的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了.....


热点排行