问个关于帧栈调用的问题
在《深入理解计算机系统》一书第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)吧?
虚心求教,希望大家能仔细指教呀:)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
为什么你会觉得是%esp而不是(%esp)呢?
popl %eax, 就是以%esp为地址,寻找栈中那个内存,读出来,赋给%eax。 然后,%esp += 4。