yehao's Blog
通过一段汇编,加深对寄存器ESP和EBP的理解
一直对寄存器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只是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数参数、局部变量等。
http://blog.csdn.net/zsJum/archive/2011/01/05/6117043.aspx
posted on 2012-02-29 17:17
厚积薄发
阅读(614)
评论(0)
编辑
收藏
引用
所属分类:
C/C++
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
__declspec,uuid,__uuidof 使用说明
解决为什么wcout不能输出中文问题
C/C++中的日期和时间 TIME_T与STRUCT TM转换
C++内存管理
Cdecl/stdcall函数调用内存模型(gcc 3.4.5)
程序执行时,栈指针ESP和栈顶指针EBP的变化
通过一段汇编,加深对寄存器ESP和EBP的理解
C++及Windows异常处理(try,catch; __try,__finally; __try, __except)
一个跨平台的 C++ 内存泄漏检测器
浅谈C/C++内存泄漏及其检测工具
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2024年11月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
统计
随笔 - 0
文章 - 147
评论 - 6
引用 - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
随笔分类
Web
(rss)
文章分类
C/C++(24)
(rss)
CxImage
(rss)
Linux编程(1)
(rss)
Web(4)
(rss)
Windows Mobile(4)
(rss)
Windows编程(67)
(rss)
计算机基础(8)
(rss)
面试题(3)
(rss)
其他(13)
(rss)
软件工程(1)
(rss)
设计模式(2)
(rss)
网络编程(21)
(rss)
文章档案
2015年3月 (2)
2015年2月 (1)
2014年7月 (1)
2014年5月 (2)
2014年4月 (1)
2014年3月 (7)
2014年2月 (2)
2013年11月 (3)
2013年10月 (3)
2013年9月 (1)
2013年8月 (1)
2013年5月 (3)
2012年12月 (2)
2012年10月 (1)
2012年9月 (16)
2012年8月 (2)
2012年7月 (2)
2012年3月 (4)
2012年2月 (7)
2012年1月 (1)
2011年12月 (2)
2011年11月 (1)
2011年10月 (4)
2011年9月 (9)
2011年8月 (7)
2011年7月 (4)
2011年6月 (14)
2011年5月 (29)
2011年4月 (15)
搜索
最新评论
1. re: 关于OS系统的x86、x64与IA32、IA64的关系[未登录]
同意楼上的说法 X64 只是 X86 的扩展
--brian
2. re: mfc CWebBrowser2获取网页源代码[未登录]
这段代码 运行到第5的行 就会报内存错误怎么回事
--yy
3. re: VC鼠标拖动动态画矩形框
经典!谢谢
--郭勇
4. re: 关于OS系统的x86、x64与IA32、IA64的关系
???,不太对
--1111
5. re: _declspec(dllexport)
刚学c++,不错
--天堂左我往右