函数的调用过程(栈帧)

先看一个简单的代码:

#include<stdio.h>
#include<stdlib.h>
int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int main()
{
	int a = 10;
	int b = 20;
	int ret = 0;
	ret = Add(a, b);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

每次的函数调用都是一个过程,这个过程我们通常称之为:函数调用 

这个过程要为函数开辟栈空间,用于本次函数的调用中临时变量的保存、现场保护。这块栈空间我们称之为:函数栈帧 

在学习栈帧时我们必须首先了解两个寄存器ebp和esp,在函数调用过程中这两个寄存器存放了维护这个栈的栈底和栈顶指针;

比如在调用main函数,我们为main函数分配栈帧空间,那么栈帧维护如下:

要详细研究函数的调用,就必须得用汇编代码:

1:任何函数都是从main函数的地方开始,要调用main函数(main函数是在mainCRTstart()中被调用),就要为main函数创建栈帧,首先先观察main函数栈帧的创建:

2:Add函数执行

3:函数返回

寄存器eax带回30后赋给ret,输出ret=30后释放为main函数开辟的堆栈。

以上就是整个函数调用的过程。

特别注意的是:

 形参是实参的一份临时拷贝,改变形参的值并不会改变实参,如果想改变实参的值,函数的参数就应该传地址,通过对地址解引用可以改变实参。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值