萌新编写,大佬勿喷
寄存器
在学习函数栈帧之前,我们要先了解寄存器.
寄存器是集成再cpu上存储数据的一小块区域,读写速度非常快用来存储指令,数据和地址.例如:ebp,esp,eax,ebx.其中ebp和esp用来维护函数栈帧
栈区
c语言中内存分配的栈区用来存储函数,随着函数的创建和销毁而使用.
栈区从高地址向低地址使用.
我们用一段非常简单的代码学习函数栈帧的创建和销毁的过程.
#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 c = 0;
c = Add(a, b);
return 0;
}
在此之前我们要知道main函数也是要被别的函数调用的
main函数被__tmainSRTStartup函数调用
寄存器ebp维护的是栈底(栈底指针)esp维护栈顶(栈顶指针)
在main函数被调用之前ebp,esp维护的是__tmainSRTStartup函数,
然后程序调用main函数开始执行main函数中的指令
我们转到反汇编
接着创建变量进行赋值
然后开始进入函数
先将传递 的参数压栈,再将call指令下一条指令的地址压栈
之后创建函数栈帧
是
蓝色是调整栈顶指针和栈底指针,绿色是初始化函数
这是栈顶储存的是call指令下一条指令的地址 然后ret指令跳到此地址
这样整个函数栈帧的流程就结束了