首页 > 技术文章 > 栈帧-ebp、esp

seeall 2020-06-05 17:24 原文

注意:以下都是从网上转载过来的。如果有自己的想法,完全是猜测,不足为准。都是我从网上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;

推荐阅读