`sub rsp,16`如何在Mac OSX上对齐堆栈?

时间:2015-03-29 20:55:54

标签: macos assembly stack x86-64 memory-alignment

我目前正在使用nasm在Mac OSX上学习x64 asm。

我遇到了对齐堆栈的问题,这是一些系统调用的必要步骤,例如malloc,这是通过这些指令完成的:

push rbp mov rbp, rsp sub rsp, 16

任何人都可以解释一下函数prolog如何对齐堆栈?我的意思是,如果它还没有达到16的倍数,为什么sub rsp, 16会纠正它?

esp = 0x35sub rsp, 16之后,esp = 0x25说对了吗?因此esp在sub之前没有对齐16的倍数,而sub也没有对齐它所以我认为我还没有完全理解"对齐堆栈"装置

有人可以告诉我在阅读时应该理解的内容#34;堆栈需要在16字节边界上对齐" ?

1 个答案:

答案 0 :(得分:1)

它没有对齐它,正如你所说它只是保持对齐。显然,只有当你想为1-15个字节的局部变量分配空间时才需要sub rsp, 16。假设堆栈已经对齐,您应该确保该数字在所需空间之上是下一个16的倍数。请注意,返回地址和帧指针最多也要加16个字节,如果你不使用帧指针,你也需要考虑它。

通常,调用约定要求在进入所有函数时以特定方式对齐,因此您只需要维护它。通常不是这种情况的唯一地方可能是在进程或线程启动时,但通常由系统库负责。