总结函数的调用过程

      本文主要总结在C编程中调用函数的过程以及栈桢的创建和销毁:

      每一次函数调用都是一个过程,这个过程要为函数开辟栈空间,用于本次函数调用中临时变量的保存、现场保护,这块栈空间称之为函数栈桢。栈桢的维护依赖于ebp和esp两个寄存器,ebp是栈底寄存器,存放了维护栈底的指针;esp是栈顶寄存器,存放了维护栈顶的指针,而从栈底到栈顶,地址由低到高。

  下面是通过在VC6.0里编程,对函数调用过程的详细解读:

代码如下:

#include <stdio.h>
#include <windows.h>
int myadd(int x, int y)
{
return x+y;
}
int main()
{
int a = 0xAAAAAAAA;
int b = 0xBBBBBBBB;
int c=0;
c = myadd(a, b);
printf("you should run here!\n");
printf("result: %d\n", c);
system("pause");
return 0;
}

第一步形成ab临时变量,分别将ab存入exa寄存器,并将其压入mian函数的栈结构中(往栈顶放数据),执行call命令,[注:call命令的功能:将当前正在执行指令的下一条指令的地址压入栈中]1所示:



图1


 

接下来跳转到myadd,此时EIP变成00401020,进入myadd函数,函数自己形成它的栈桢架构:如图2所示:

 





图2

最后进行栈桢的销毁及函数值的返回,如图3所示

(注:函数值返回是以寄存器的形式返回)



图 3

图4为函数调用过程完整示意图:


图4 

    以上是我对函数调用过程栈桢的创建及销毁过程的理解,理解上有不对的地方希望大家提出宝贵意见!


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值