【C语言】深度理解函数的调用过程(栈帧)

本文是在栈帧层面来深度理解函数的调用过程,那么栈帧具体在内存的那个地方?
这里写图片描述
下面利用简单的调用求和函数深度理解函数的调用过程

#include <stdio.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 = Add(a, b);
	printf("ret=%d\n", ret);
	return 0;
}

调试程序,查看调用堆栈

main函数在__tmainCRTStartup 函数中调用的,而__tmainCRTStartup函数是在mainCRTStartup函数中被调用的。

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

而栈帧的维护有两个寄存器ebpesp 。这两个寄存器存放了维护这个栈的栈底和栈顶。
main函数的栈帧维护图示
了解以上基本概念后,接下来深入了解函数调用的过程。

程序从main函数的地方开始,要展开main函数的调用就得为main函数创建栈帧。

1.main函数栈帧的创建

main函数栈帧的创建

2.接下来就是Add函数的调用

Add函数调用
执行call指令时,按下F11,来到了这里:

再按F11就来到了Add函数的内部:

接下来就到了函数返回部分:

按F10返回到main函数内部:

到这里一个函数完整的调到用到此就结束。

总结

函数的调用过程,能够深入的了解到函数在内存中到底是怎样存储和运行的。有助于我们理解更加复杂的函数,即使我们不知道函数的功能,也能够分析出函数正确的结果。

如有不足之处,欢迎指正!!

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值