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