免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2857 | 回复: 6
打印 上一主题 下一主题

ebp与esp的疑惑! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-15 12:23 |只看该作者 |倒序浏览
本帖最后由 C_H_L 于 2013-05-15 12:24 编辑

最近学习AT&T汇编,看到下面一段:
function_label:
                    pushl   %ebp    
                    movl  %esp, %ebp
                    < normal function code goes here>
                    movl %ebp,  %esp
                    popl   %ebp
                    ret
这段代码,目的是把esp放到ebp中
(1) 为什么红色部分还要把ebp压栈、出栈?
(2) 没有pushl %ebp 和 popl %ebp难道就不行?
求解!不胜感谢!

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
2 [报告]
发表于 2013-05-15 17:36 |只看该作者
这是因为要保存函数入口处ebp的值。

论坛徽章:
0
3 [报告]
发表于 2013-05-15 18:29 |只看该作者
回复 2# EricFisher
首先,谢谢你的回答。
是不是说,如果函数入口处ebp的值用不到,就没必要这样做?
   

论坛徽章:
0
4 [报告]
发表于 2013-05-15 22:58 |只看该作者
结贴,找到解释了:
-->IF you are calling a function that modifies registers the main program uses, it is crucial that you save the current state of the registers before calling the function, and then restore them after the function returns.
-->You can either save special registers individually using the PUSH instruction or save all of the registers together using PUSHA instruction before calling the function. Similarly, you can restore the registers back their original state either individually using the POP instruction or together using then POPA instruction.
再次十分感谢楼上的精简回答.

论坛徽章:
0
5 [报告]
发表于 2013-08-02 11:00 |只看该作者
有些寄存器是调用函数保存,有些是被调用函数保存。 64位机器就不需要保存ebp

论坛徽章:
0
6 [报告]
发表于 2013-08-20 00:11 |只看该作者
回复 5# djsxut
我想问你两个问题,如果你能答上,说明你真的懂。
(1)Linux procedure的stack frame中,当调用一个procedure时,frame pointer发生什么变化?调用完成,返回caller后,frame pointer又发生什么变化?
(2)为什么64位机器就不需要保存ebp?和32位机器区别?相比32-bit,有什么进步?(这个问题,我没研究过,需要你给出解答)
   

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
7 [报告]
发表于 2013-08-23 16:08 |只看该作者
回复 6# C_H_L


    (1)Linux procedure的stack frame中,当调用一个procedure时,frame pointer发生什么变化?调用完成,返回caller后,frame pointer又发生什么变化?
 函数调用时寄存器的管理使用与函数的调用约定相关,是可以变化的。默认情况下参数从右往左开始压栈。其stack 布局如下:
               Last argument
               ...
 4(%esp)          First argument
 (%esp)      Return address


    (2)为什么64位机器就不需要保存ebp?和32位机器区别?相比32-bit,有什么进步?
         64位CPU除了扩展原有的寄存器 (RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, RFLAGS, RIP)到64位之外还有8个64位的通用寄存器(R8-R15),也就是说可以有理多的计算直接使用寄存器来加速计算性能。和32位最大的区别在于默认使用的寄存器是64位的。
         64位CPU不使用ebp,它使用RBP,依然需要保存RBP的。在函数调用返回时编译器生成的代码可能使用LEAVE来代替POP。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP