浅谈对栈帧的理解

来源:互联网 发布:windows声音设置 编辑:程序博客网 时间:2024/05/17 06:03

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

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

EBP:基址寄存器

ESP:栈顶寄存器

EIP:指令寄存器

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

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

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

来看一段代码:

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

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

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