函数的调用是一个过程,那么在函数的调用过程中要开辟栈空间,用来对本次函数的调用中需要的临时变量保存。这块空间叫栈帧。这个过程调用包括将数据和控制从代码的一部分传递到另一部分。过程调用的任务:为过程的局部变量分配空间,并在退出时释放这些空间,俗称保存现场/恢复现场。栈的作用:参数传递、局部变量分配、保存调用的返回地址、保存寄存器以供恢复栈帧:为单个过程分配的那部分栈称为栈帧
这是代码在内存的分布:
一般栈形图如下:
下面,我们用一个简单的函数调用过程来看这个过程。我们写了一段简单的代码:
#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("result: %d\n", ret);
return 0;
}
对应的反汇编为:
int main()
{
008C17D0 push ebp //把ebp压入栈中,方便返回
008C17D1 mov ebp,esp //把esp赋值给ebp
008C17D3 sub esp,0E4h //产生新的esp
(这一部分的功能就是开辟新的栈帧)
008C17D9 push ebx
008C17DA push esi
008C17DB push edi
008C17DC lea edi,[ebp-0E4h]
008C17E2 mov