【问题标题】:How does `sub rsp, 16` aligns the stack on Mac OSX?`sub rsp, 16` 如何在 Mac OSX 上对齐堆栈?
【发布时间】:2015-03-29 20:55:54
【问题描述】:

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

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

push rbp mov rbp, rsp sub rsp, 16

谁能解释一下函数 prolog 是如何对齐堆栈的?我的意思是,如果它还不是 16 的倍数,为什么 sub rsp, 16 会更正它?

假设esp = 0x35,在sub rsp, 16esp = 0x25之后,对吗?所以 esp 在 sub 之前没有对齐 16 的倍数,sub 也没有对齐它,所以我想我还不太明白“对齐堆栈”是什么意思。

当我读到“堆栈需要在 16 字节边界上对齐”时,有人能告诉我应该理解什么吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 好的,谢谢,这就是我的想法,sub rsp,16 只为局部变量或函数节省了一些空间,例如 malloc 要求堆栈指针比基指针多 16 个字节(至少在OSX)
    • 虽然我不在 Mac 上,但我看到编译器对堆栈变量进行对齐,但不使用 sub。这里有一些讨论:stackoverflow.com/a/29176989/2189500
    • 如果堆栈在函数入口处对齐,那么 push rbp 将不对齐它。如另一个线程中所述,使用 |和 rbp,-16 |将对齐它。
    • 你能详细说明一下吗?当 push 指令完成时,堆栈向下移动 8 个字节(64 位)不是吗?为什么 sub rsp, 16 对齐它?不应该是 sub rsp, 8 吗?
    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 2013-03-05
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多