我正在尝试学习一点汇编,因为我需要它来参加计算机体系结构课程。我写了一些程序,比如打印斐波那契数列。
我认识到,每当我编写一个函数时,我都会使用这三行(正如我通过比较由gcc
to its C
相等的):
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
- 首先,为什么我需要使用
%rbp
?使用起来是不是更简单%rsp
,因为它的内容被移动到%rbp
在第二行?
- 为什么我必须从中减去任何东西
%rsp
?我的意思是这并不总是16
, 当我是printf
像 7 或 8 个变量,然后我会减去24
or 28
.
我在虚拟机(4 GB RAM)、Intel 64 位处理器上使用 Manjaro 64 位。
rbp
是 x86_64 上的帧指针。在生成的代码中,它获取堆栈指针的快照(rsp
),这样当进行调整时rsp
(即为局部变量保留空间或push
ing值到堆栈上),局部变量和函数参数仍然可以从常量偏移访问rbp
.
许多编译器提供帧指针省略作为优化选项;这将使生成的汇编代码访问相对于rsp
相反并释放rbp
作为在函数中使用的另一个通用寄存器。
对于 GCC,我猜您正在使用 AT&T 汇编器语法,该开关是-fomit-frame-pointer
。尝试使用该开关编译您的代码,看看您得到什么汇编代码。您可能会注意到,当访问相对于rsp
代替rbp
,在整个函数中,距指针的偏移量是变化的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)