提问者:小点点

堆栈中的保留字节:x86 Assembly(64位)


pushq   %rbp
movq    %rsp, %rbp
subq    $32, %rsp

关于第三条指令中“32美元”的解释,我有一个大问题。来自搜索和博客的信息指出,在上面的第三条指令中,我们为堆栈保留了某些“字节”空间。从文档来看,%rsp是64位寄存器,%esp是32位。

“32美元”是指32字节吗?($number表示常数?)如果是,那么我们如何在64位寄存器上分配32字节?上述指令是从“otool”生成的。我使用的是macbook pro。

我只是想学习一些关于组装的小事。

谢谢。


共2个答案

匿名用户

“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/