什么是栈帧?
从逻辑上讲,栈帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里等等。
首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。
注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念;ESP所指的栈帧顶部和系统栈的顶部是同一个位置。 ————百度百科
先识记几个汇编中的寄存器和命令:
1.call命令:将当前正在执行的指令的地址压入栈中,跳转至目标函数的地址进行函数调用
2.ebp:基址寄存器(保存栈底)
3.esp:栈顶寄存器
4.eip:指令寄存器(程序计数器)
5.ret:返回过程调用,弹出栈顶地址,将函数返回地址弹到eip
为方便查看汇编,及监视本次采用vc++6.0编译器
测试源代码如下:
#include <stdio.h>
int myadd(int x, int y)
{
int z = x+y;
return z;
}
int main()
{
int a = 0xaaaaaaaa;
int b = 0xbbbbbbbb;
int c = myadd(a,b);
printf("you should run here!");
return 0;
}
总结:
函数调用可以大致分为以下几个过程:
1.首先,从main函数开始,要展开mian函数的调用,就要先为main函数创建栈帧。
2.调用myaddd函数,这时要为myadd函数创建栈帧,传参时注意参数是从后向前传。(形参实例化)
3.先ret返回myadd函数,然后返回main函数。(返回后栈帧结构释放)