我有几个组装项目要实现,而对于何时在堆栈上增加空间以及应该增加多少空间,我感到困惑。
我在UNIX系统(macos)英特尔x86_64上使用NASM版本2.13.03。
我已经阅读了很多文档,做了很多研究,但没有一个以足够详细的方式解释我的问题的答案。 我了解红色区域,并且叶子功能不需要使用增加的堆栈。
我知道应该在函数调用之前使用sub rsp增加堆栈,而应该在函数调用之后使用add rsp。
我知道在32位体系结构上,您可以使用push和pop来增加堆栈,但是在这种64位体系结构上,则需要使用sub rsp和add rsp以及mov指令在其上添加寄存器堆栈。
如果有人对在此体系结构中使用堆栈有任何建议或解释,并说明何时增加堆栈以及应提供多少,则非常感谢!
答案 0 :(得分:0)
一些x86-64堆栈原则:
根据两个主要的调用约定,包括在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
一样有效或更有效。除此之外,通常不会。