浅谈C语言中的函数调用方式-----栈帧结构

    首先,关于栈,在地址空间中栈是向下生长的,也就是说栈底地址是高地址,栈顶地址是底地址。而在CPU中有两个寄存器ebp,esp分别是用来保存栈底地址与栈顶地址的,而ebp又被称为帧指针或基址指针,esp又被称为栈指针。而对于同一个栈而言,栈底是不会变的,也就是说ebp的指向是不会变的,而当有入栈和出栈情况时,只会改变栈顶位置也就是esp的指向。

   而对于函数而言,每个函数都有自己独立存在的栈帧结构,但是在一个栈帧结构中必定存在栈顶和栈顶,而它们的地址又要分别保存在esp,ebp中,但在CPU当中只存在一个ebp,一个esp,那么在函数调用过程中必定存在栈帧结构的变化,而栈帧结构的变化又能很明确的说明函数调用过程。

   下面来分析一个简单的函数调用:

#include <stdio.h>
#include <windows.h>
int fun(int x,int y)
{
	int c=0xcccccccc;
	return c;

}
int main()
{
	int a=0xaaaaaaaa;
	int b=0xbbbbbbbb;
	int ret=fun(a,b);
	system("pause");
	return 0;
}
对于上面这个程序,很简单只是main函数调用了fun函数,下面我们通过这个程序的汇编代码来分析这个程序中函数的调用过程:

我们按照程序的实际调试顺序来分析该程序的汇编:

1.首先进入main函数:



2.跳转到fun函数:

3.返回到main函数:

通过对该程序汇编的分析,我们可以得到关于函数调用过程的栈帧结构变化的一张图:



综上我们可以总结出:C语言中函数的调用过程就是旧函数与新函数栈帧结构的形成与恢复过程。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值