浅谈对栈帧的理解

首先说明,栈帧的作用是函数调用时的过程记录,它存储在用户的栈上。

了解栈帧的时候我们需要知道的知识:

EBP:基址寄存器

ESP:栈顶寄存器

EIP:指令寄存器

汇编语言知识:mov:把数据放到地址里。 call:默认将下一条指令地址压入栈中。ret:弹出栈顶地址,放在eip寄存器中;push:压变量入栈;pc指针:程序计数器,永远指向指令的下一条指令。

接下来我们来看看栈帧的结构:

浅谈对栈帧的理解_第1张图片

栈帧主要作用是控制和保存一个过程中的所有信息。

来看一段代码:

#include
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",ret);
return 0;
}

浅谈对栈帧的理解_第2张图片

在函数最开始执行的是main函数,那么此时先为main函数开辟存储空间,且ebp指向栈底,esp指向栈顶,看上图,在main函数栈帧中,定义并初始化a,b,实际上就是把一个值放到内存中去,中间需要用到mov指令,分别为a,b开辟空间,在fun函数栈帧中,调用函数时,变量是已经创建好的,这里强调参数实例化,是从右到左mov的,故b先入栈。

把a,b形参push进栈后,开始执行call指令。








         

你可能感兴趣的:(浅谈对栈帧的理解)