问个关于帧栈调用的问题

发布于 2022-09-29 21:36:00 字数 542 浏览 17 评论 0

在《深入理解计算机系统》一书第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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

波浪屿的海角声 2022-10-06 21:36:00

为什么你会觉得是%esp而不是(%esp)呢?

popl %eax, 就是以%esp为地址,寻找栈中那个内存,读出来,赋给%eax。 然后,%esp += 4。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文