专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 汇编语言

c函数编译后为什么头部必有push EBP,mov EBP,ESP?解决方法

发布时间:2010-06-14 15:51:25 文章来源:www.iduyao.cn 采编人员:星星草
c函数编译后为什么头部必有push EBP,mov EBP,ESP?
c函数编译后为什么头部必有push EBP,mov EBP,ESP?
其实,不用这两句也是可以的,如果指定为naked就可以。
那么编译器为什么给每个函数的头部插入push EBP,mov EBP,ESP?



------解决方案--------------------
因为接着要将此时的 esp 赋予 ebp 以便后面用 ebp 来作为栈基并以此通过 [ebp+??] 来访问函数的参数、以 [ebp-??] 来访问函数的变量。
如果不使用 ebp 来做这个的话,也是可用直接通过 esp 来实现的;只是由于函数里,栈指针是不断变化的,对某个参数或变量的访问,esp 所跟的偏移在不同的地方也可能是不一样的,这对编译程序可能开销不大,但对调试人员对代码的分析来说,简直就是灾难了。所以通常是尽可能地不采用这个方式,除非是……
------解决方案--------------------
不同的编译器有不同的偏好,对于微软的VS系列,编译器总是生成使用[ebp-disp]的代码来访问局部变量。而对于Intel的编译器,则一般生成使用 【esp+disp】这样的代码来访问局部变量和传入参数,这样,对一个函数来说,不但可以节省几条代码,而且ebp寄存器也可以缓冲一个变量。对于小的函数,intel的编译方式可明显提升函数性能。
------解决方案--------------------
如上所说,不同编译器有不同的处理,每个人可以写出几百种不同的方法。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: