寄存器ESP和EBP
来源:互联网 发布:宜家沙发 知乎 编辑:程序博客网 时间:2024/06/01 09:54
原文: http://blog.csdn.net/zsJum/article/details/6117043
一直对寄存器ESP和EBP的概念总是有些混淆,查看定义ESP是栈顶指针,EBP是存取堆栈指针。还是不能很透彻理解。之后借于一段汇编代码,总算是对两者有个比较清晰的理解。
下面是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码
假设执行函数前堆栈指针ESP为NN
push p2 ;参数2入栈, ESP -= 4h , ESP = NN - 4h
push p1 ;参数1入栈, ESP -= 4h , ESP = NN - 8h
call test ;压入返回地址 ESP -= 4h, ESP = NN - 0Ch
;//进入函数内
{
push ebp ;保护先前EBP指针, EBP入栈, ESP-=4h, ESP = NN - 10h
mov ebp, esp ;设置EBP指针指向栈顶 NN-10h
mov eax, dword ptr [ebp+0ch] ;ebp+0ch为NN-4h,即参数2的位置
mov ebx, dword ptr [ebp+08h] ;ebp+08h为NN-8h,即参数1的位置
sub esp, 8 ;局部变量所占空间ESP-=8, ESP = NN-18h
...
add esp, 8 ;释放局部变量, ESP+=8, ESP = NN-10h
pop ebp ;出栈,恢复EBP, ESP+=4, ESP = NN-0Ch
ret 8 ;ret返回,弹出返回地址,ESP+=4, ESP=NN-08h, 后面加操作数8为平衡堆栈,ESP+=8,ESP=NN, 恢复进入函数前的堆栈.
}
看完汇编后,再看EBP和ESP的定义,哦,豁然开朗,
原来ESP就是一直指向栈顶的指针,而EBP只是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数参数、局部变量等。
0 0
- 寄存器ESP和EBP
- esp和ebp寄存器
- ESP和EBP指针寄存器
- 关于寄存器ESP和EBP
- 对寄存器ESP和EBP的理解
- 观察栈帧和EBP、ESP寄存器
- 寄存器ESP和EBP的理解
- 关于EIP、EBP和ESP寄存器
- 汇编寄存器之 ESP和EBP
- 6.指针寄存器-EBP和ESP寄存器与其用途
- ESP EBP等寄存器简介
- cpu 寄存器 esp ebp eip
- 关于寄存器ESP和EBP的一些理解
- 关于寄存器ESP和EBP的一些理解
- 关于寄存器ESP和EBP的一些理解
- 关于寄存器ESP和EBP的一些理解
- 对寄存器ESP和EBP的一些理解
- 关于寄存器ESP和EBP的一些理解
- fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 与VC多版本相关
- 游戏服务器之多进程架构通信
- PC、平板、智能终端大战
- 终于完成了我的Sudoku程序了,以后就可以轻松解数独了
- [2014.1.31] Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)
- 寄存器ESP和EBP
- C++学习日记 --C++变量
- JDK在Ubuntu环境下的Shell脚本自动安装
- 谷歌的现实、摩托的无奈与联想的接盘
- 在windows下更改mysql默认的datadir文件的位子
- Spring事务配置的五种方式
- 京东提交IPO文件 拟赴美上市
- 2014,从这里开始了
- [贪心]cf226bBear and Strings