pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
关于第三条指令中“32美元”的解释,我有一个大问题。来自搜索和博客的信息指出,在上面的第三条指令中,我们为堆栈保留了某些“字节”空间。从文档来看,%rsp是64位寄存器,%esp是32位。
“32美元”是指32字节吗?($number表示常数?)如果是,那么我们如何在64位寄存器上分配32字节?上述指令是从“otool”生成的。我使用的是macbook pro。
我只是想学习一些关于组装的小事。
谢谢。
“32美元”是指32字节吗?($number表示常数?)如果是,那么我们如何在64位寄存器上分配32个字节?
这32个字节不在64位寄存器上分配。它们分配在堆栈上。通过降低堆栈指针(在%rsp中),从%rsp到%rsp 31的地址范围可供我们用于存储数据。
在64位代码中,已经为您保留了128个字节,因此您不必弄乱叶函数中的堆栈指针,这意味着您可能不必推送/pop%rbp。只需为您的数据使用%rsp-128到%rsp-1。
这个保留区域称为红区:
http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/