为了深入学习函数和理解函数每一步实现都干了什么,那我们来深入研究函数的调用过程;
先看一段代码:用函数实现两个数的和。
#include<stdio.h>
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = Add(a, b);
printf("%d\n", c);
return 0;
}
我们先了解ebp和esp两个寄存器,在函数调用的过程中这两个存放在维护这个栈的栈底和栈顶指针。
如果要调用main函数,我们就要为main函数分配栈帧空间。

要展开main函数的调用,就要为main函数创建栈帧。下图:

main函数调用完,然后就是Add函数的调用;如下图:

验证call的作用:

按F11后进入Add函数的反汇编代码:

最后的部分:


最后再是打印函数的调用。

函数的调用过程,要回函数开辟栈空间,用于这次函数被调用中的临时变量的保存,现场保护。所以我们叫它函数栈帧。
不同的编译器可能存在差异,但是调用函数的精髓和思想是不会改变的。
本文通过一个简单的加法函数实例,详细介绍了函数调用过程中栈帧的创建与使用,包括ebp和esp寄存器的作用及如何为函数分配栈空间。
620

被折叠的 条评论
为什么被折叠?



