首页
社区
课程
招聘
[求助]关于函数体内用esp或ebp做局部变量的问题!
发表于: 2010-2-5 10:57 7572

[求助]关于函数体内用esp或ebp做局部变量的问题!

2010-2-5 10:57
7572
我是初学者,一直有个问题困扰这我,我们一般在反编译函数体内会看到
push ebp
mov ebp,esp
...
然后在访问局部变量时一般都是用ebp做基址来访问局部变量
但是有时个在同一个程序不同函数体内有的是用esp做为基址来访问局部变量的
不知道为什么会这样,也不知道是什么会造成不同的用法。
既然是同一个编译器为什么会出现这样的情况呢?希望大哥们解释一下,谢了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 150
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
作为局部变量指针
2010-2-5 11:32
0
雪    币: 220
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼上未看明白我的意思,我的意思是说,为什么有时候用ebp 而有时候却用esp
我们知道一般都是用ebp的
2010-2-5 11:45
0
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
FP0.....
2010-2-5 11:58
0
雪    币: 424
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
就算是同一个编译器,对于不同的函数会自己选择合适的编译方式。里面有很多使用者想象不出的东西,并不是简单的翻译转换一下那么简单的。
想了解可以参考一些高端的编译器设计的资料,一般的编译原理都不会涉及
2010-2-5 13:20
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
在子程序里面如果用到ESP 有两种可能,一种是传地址指针过去,还有一种大多是传参数过去
2010-2-5 14:03
0
雪    币: 76
活跃值: (27)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
编译器的问题而已,为了优化就没有使用ebp。其实用不用都无所谓,只要能够保证堆栈平衡
只是看汇编代码的时候很吃力而已
2010-2-5 16:45
0
雪    币: 3
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
用ebp做一个esp的保存很多时候用在需要esp对齐到一个比如说16字节对齐的位置时候用吧
然后本函数被传入的参数用ebp访问,esp访问本函数里面的局部变量
2010-2-6 02:48
0
雪    币: 171
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
使用esp而不使用ebp,称为FPO---栈指针省略。使用ebp,对于分析汇编更加方便,编译器采用FPO的原因是可以减少代码体积,提高执行效率,毕竟节省了几行汇编。编译器里可以设置FPO选项。
2010-2-9 09:32
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
遇到这种情况,个人一般边看代码边算堆栈变化,习惯了就会比较熟悉了的,比ebp寻址的麻烦不到哪去
2010-2-11 18:59
0
雪    币: 220
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢各位解答,总算明白了
2010-2-11 19:58
0
雪    币: 39
活跃值: (2691)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
(1) 在VC++中,你只要点
Project->Settings->C/C++
->Optimizations->Disable(Debug)
这样编译出来的堆栈框架就是EBP的;
(2) 在C++Builder中,
Project->Options->Compiler->Compiling->Stack frames(打勾)
这样编译出来的堆栈框架也是EBP的;
2010-2-11 21:13
0
雪    币: 68
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
额。。还有这么多学问呢啊。呵呵。学习了。。FPO。。。
2010-2-13 11:03
0
游客
登录 | 注册 方可回帖
返回
//