栈帧-ebp、esp
注意:以下都是从网上转载过来的。如果有自己的想法,完全是猜测,不足为准。都是我从网上copy过来的。
概念:ebp和esp是两个重要的指针寄存器:
(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶(但是他是低地址,并且也是向低地址延伸的)。
(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部(但是他是髙地址)。
例子:
testAdd(int a, int b){
return a+b;
}
test{
int m = 1;
int n = 2;
testAdd(m, n);
}
1,push m;
-- esp向低地址延伸4个字节(1个slot?),再将m的值压入栈顶,因为int是4个字节大小;
2,push n;
-- esp向低地址延伸4个字节(1个slot?),再将n的值压入栈顶,因为int是4个字节大小;
3,call testAdd;
-- esp向低地址延伸4?个字节(1个slot?),调用testAdd,将返回地址压入栈顶,并跳转到testAdd;
4,push ebp;
-- esp向低地址延伸4?个字节(1个slot?),再将寄存器ebp的值压入栈顶;
5,mov ebp,esp;
-- 将寄存器esp的值填入寄存器ebp中;
6,方法testAdd开始执行,新的栈帧开始,...;
7,mov esp,ebp;
-- 将寄存器ebp的值填入寄存器esp中;
8,pop ebp;
-- 将此时栈顶的数据使用寄存ebp接收;
9,retn;
-- 返回步骤3?
各步骤对应的示例图如下所示:
(注意:没有使用二进制且用16进制方便展示,而是使用10进制更加方便展示)
1,
2,
3,
4,
5,
6,
7,
8
9, void也算是一种返回值类型;
其他:
网上还有一个版本是:
1,push m;
2,push n;
3,call testAdd;
4,push ebp;
5,mov ebp,esp;
6,方法testAdd开始执行,新的栈帧开始,...;
7,pop ebp;
8,ret 8;