免费注册 查看新帖 |

Chinaunix

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

问个关于帧栈调用的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-31 16:43 |只看该作者 |倒序浏览
在《深入理解计算机系统》一书第145页,给了一道练习题,如下:

下面的代码经常出现在库函数的编译版本中
    call next
next:
    popl %eax
(1)寄存器%eax设置成了什么值?
(2)解释这个调用为什么没有匹配的ret指令
(3)这端代码完成了什么功能?

答案是:
这是汇编的一个习惯用法,他根本不是一个真正的过程调用
(1)%eax设成了popl指令的地址
(2)这不是一个真正的子过程调用,因为控制是按照与指令相同的顺序进行的,而返回值是从栈中弹出的
(3)这是IA32中将程序计数器的值放到整数寄存器中的唯一方法

问题:我知道Popl %eax一般等同于
movl (%esp),%eax
addl  $4,%esp

题中,这个popl指令的地址应该是%esp而不应该是(%esp)吧?
虚心求教,希望大家能仔细指教呀:)

论坛徽章:
0
2 [报告]
发表于 2007-08-01 09:51 |只看该作者
为什么你会觉得是%esp而不是(%esp)呢?

popl %eax, 就是以%esp为地址,寻找栈中那个内存,读出来,赋给%eax。 然后,%esp += 4。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP