首页
社区
课程
招聘
[讨论]标准编译器什么情况下会使用ebp传递参数?
发表于: 2015-10-31 21:51 6804

[讨论]标准编译器什么情况下会使用ebp传递参数?

bxc 活跃值
6
2015-10-31 21:51
6804

最近分析一个程序,是msvc的,基于mfc的程序,分析一个成员函数时发现使用了ebp传递参数。


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

收藏
免费 3
支持
分享
最新回复 (6)
雪    币: 204
活跃值: (911)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
2
啊?PUSH不是用的堆栈么
2015-10-31 23:37
0
雪    币: 114
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
编译器有标准吗?
push ebp 是堆栈吧?
像 mov ecx,xxx ,lea ecx 这类才是用ecx传递参数吧?
2015-11-1 00:54
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
4
OD跟踪时,ebp的值是2,明显是个参数。
我的意思是在这段代码的调用者那里,ebp被赋值,然后这段代码使用ebp传递进来的参数。
跟实际情况有些出入,大致意思不变。

实际情况是,这段代码是个类成员函数,this通过ecx传递进来,另外还有一个参数。是某控件的id。
而ebp正好是这个参数的备份,粗略的看下这段代码就能发现,该函数被编译时并没有框架指针(Frame Pointer Omission优化?)所以ebp寄存器可以空闲出来留作它用。
如果以c++来表达这个函数的话,应该是下面这样的:
int __thiscall func(int id);

或者
int ClsXX::func(int id);


但是我分析时发现在这段代码里使用那个id参数时,有2种方式:
一种是传统的栈寻址[esp+XX],因为没有框架指针所以是esp寻址。
另一种就是直接push ebp。
2015-11-1 02:10
0
雪    币: 114
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
你说的是不是这个?,VC的/Oy选项。
http://www.cnblogs.com/awpatp/archive/2009/11/04/1595988.html

Frame Pointer Omission 我觉得翻译为“栈帧指针删减”好一点.

这样也只是把ebp作为普通寄存器而已,push ebp跟push eax没什么不同。都是把寄存器的值放到堆栈而已。
子函数访问参数时仍是访问堆栈。
如果ebp的值在调用中没有发生改动的话,可能会被再次利用,这个只有编译器才知道了。

传统的参数访问是用 ebp +- xxxx,
用了这个选项之后,ebp留作他用,改用 esp 寻址。
2015-11-1 03:30
0
雪    币: 435
活跃值: (1287)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
6
肯定是fpo优化了
未优化的代码,ebp是栈帧基址,用来局部变量寻址,一般函数体内值都不会动
开了fpo,ebp就跟几个通用寄存器一样了
里面放个临时变量很正常
2015-11-2 16:16
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
7
我觉得好像也是这样~
2015-11-2 20:34
0
游客
登录 | 注册 方可回帖
返回
//