我什么时候应该使用RSP寄存器为堆栈增加空间?

时间:2019-03-29 17:17:30

标签: stack x86-64 nasm intel cpu-registers

我有几个组装项目要实现,而对于何时在堆栈上增加空间以及应该增加多少空间,我感到困惑。

我在UNIX系统(macos)英特尔x86_64上使用NASM版本2.13.03。

我已经阅读了很多文档,做了很多研究,但没有一个以足够详细的方式解释我的问题的答案。 我了解红色区域,并且叶子功能不需要使用增加的堆栈。

我知道应该在函数调用之前使用sub rsp增加堆栈,而应该在函数调用之后使用add rsp。

我知道在32位体系结构上,您可以使用push和pop来增加堆栈,但是在这种64位体系结构上,则需要使用sub rsp和add rsp以及mov指令在其上添加寄存器堆栈。

如果有人对在此体系结构中使用堆栈有任何建议或解释,并说明何时增加堆栈以及应提供多少,则非常感谢!

1 个答案:

答案 0 :(得分:0)

一些堆栈原则:

根据两个主要的调用约定,包括在MacOS上使用的x86-64 System V ABI,在调用函数之前,

堆栈需要 16字节对齐。如果不是这样,则在调用外部函数时冒分段错误的风险。 (例如,因为允许他们假定对齐并使用movaps到/从堆栈存储器的16字节副本。)

有趣的事实-在MacOS上,当堆栈未对齐16字节时,系统调用可以正常工作。

对于push rax,将rax值压入堆栈顶部。
对于sub rsp,8,堆栈的顶部保持不变(因此,内存中的所有内容都将保留在那里)。 两种说明对rsp值的更改完全相同

例如,您可以执行以下任一操作:

sub rsp,16

push rax
push rax

堆栈指针rsp指向完全相同的位置。


对于仅将堆栈指针移动8,虚拟推入或弹出可能与add/sub一样有效或更有效。除此之外,通常不会。