为了深入学习函数和理解函数每一步实现都干了什么,那我们来深入研究函数的调用过程;
先看一段代码:用函数实现两个数的和。
#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函数的反汇编代码:
最后的部分:
最后再是打印函数的调用。
函数的调用过程,要回函数开辟栈空间,用于这次函数被调用中的临时变量的保存,现场保护。所以我们叫它函数栈帧。
不同的编译器可能存在差异,但是调用函数的精髓和思想是不会改变的。