我正在为 x86_64 编写中断处理例程。 ABI 指定在调用 C 函数之前我必须将堆栈对齐到 16 字节。 x86_64 ISA 指定在进入 ISR 时,我的堆栈是 8 字节对齐的。因此,我需要将我的堆栈指针对齐到 16 个字节。问题是,从我的 C 函数返回时,我必须恢复(可能)未对齐的堆栈指针,以便我可以正确地从中断中返回。
我想知道是否有一种方法可以不使用通用寄存器来做到这一点?
最佳答案
这是我对问题的解答:
pushq %rsp
pushq (%rsp)
andq $-0x10, %rsp
call function
movq 8(%rsp), %rsp
这两次压入使堆栈保持原来的对齐方式,并在 (%rsp)
和 8( %rsp)
。 andq
然后对齐堆栈 - 如果它已经是 16 字节对齐,则没有任何变化,如果它是 8 字节对齐,则它从 %rsp
中减去 8,这意味着原始 %rsp
现在位于 8(%rsp)
和 16(%rsp)
。所以我们可以无条件地从8(%rsp)
恢复它。
关于c - x86_64 对齐堆栈并在不保存寄存器的情况下恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9592345/