博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android Pro] ESP和EBP 栈顶指针和栈底指针
阅读量:7060 次
发布时间:2019-06-28

本文共 1292 字,大约阅读时间需要 4 分钟。

  

   cp:  

 

(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。

(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

 

【本次重点内容:了解几个常见的寄存器名字,记住eax一般用来保存函数的返回值,记住esp是栈顶指针寄存器,ebp是栈底指针寄存器。】

ESP 中的指针将一直指向这个新位置, 所以 ESP 中的地址数据是动态的.

 

-----

  cp :    

esp是栈指针,是cpu机制决定的,push、pop指令会自动调整esp的值;

ebp只是存取某时刻的esp,这个时刻就是进入一个函数内后,cpu会将esp的值赋给ebp,此时就可以通过ebp对栈进行操作,比如获取函数参数,局部变量等,实际上使用esp也可以;

既然使用esp也可以,那么为什么要设定ebp呢?

答案是为了方便程序员。

因为esp在函数运行时会不断的变化,所以保存一个一进入某个函数的esp到ebp中会方便程序员访问参数和局部变量,而且还方便调试器分析函数调用过程中的堆栈情况。前面说了,这个ebp不是必须要有的,你非要使用esp来访问函数参数和局部变量也是可行的,只不过这样会麻烦一些。

 

通过一段程序理解esp和ebp:

main() {

//执行test前

print(int p1,int p2);

//执行test后

}

分析下上面程序的调用原理,假设执行print前esp=Q:

push p2; //函数参数p2入栈,esp=Q-4H

push p1; //函数参数p1入栈,esp=Q-8H

call print; //函数返回地址入栈,esp=Q-0CH

//现在进入print内,做些准备工作:

push ebp; //保护先前ebp指针,ebp入栈,esp=Q-10H

mov esp,ebp; //设置ebp等于当前的esp

// 此时,ebp+0CH=Q-4H,即p2的位置

// 同样,ebp+08H=Q-8H,即p1的位置

// 下面是print内的一些操作:

sub esp,20H; //设置长度为10H大小的局部变量空间,esp=Q-20H

// ... ...

// 一系列操作

// ... ...

add esp,20H; //释放局部变量空间,esp=Q-10H

pop ebp; //出栈,恢复原先的ebp的值,esp=Q-0CH

ret 8; //ret返回,弹出先前入栈的返回地址,esp=Q-08H,后面加操作数8H为平衡堆栈

// 之后,弹出函数参数,esp=Q,恢复执行print函数前的堆栈;

 

图示,注意栈在内存中的生长方向是逆向:

执行push p2;前,esp=Q;

执行push p2;过程中,esp-=4H,p2入栈;

执行push p2;后,esp=Q-4H;

 

转载于:https://www.cnblogs.com/0616--ataozhijia/p/8549213.html

你可能感兴趣的文章
【记录一个问题】linux + opencv + gpu视频解码,好不容易编译通过,运行又coredump了...
查看>>
组合式继承
查看>>
Ext:ComboBox实战
查看>>
实用算法实现-第 11 篇 贪心算法
查看>>
MongoDB的介绍、安装和使用
查看>>
闭包最常用的三种用法
查看>>
问题总结
查看>>
Ubuntu Mac 主题
查看>>
Django - 创建多对多及增加示例
查看>>
文档碎片恢复
查看>>
testNG框架,使用@BeforeClass标注的代码,执行失败不抛出异常,只提示test ignore的解决方法...
查看>>
[C++基础]020_C++0x新特性之右值引用(int&& value)
查看>>
java高并发之CountDownLatch,CyclicBarrier和join
查看>>
【简易版】IOS仿periscope自制狂赞飘桃心
查看>>
xss其他标签下的js用法总结大全
查看>>
《图像处理实例》 之 寻找图纸标注
查看>>
3的幂的和
查看>>
Maximum Value(CodeForces - 484B)
查看>>
ASP_NET Global_asax详解
查看>>
hdu2067 小兔的棋盘 DP/数学/卡特兰数
查看>>