x86_64对齐堆栈并在不保存寄存器的情况下恢复

dsc*_*atz 5 c stack x86-64 alignment

我正在为x86_64编写中断处理例程.ABI指定在调用C函数之前,我必须将堆栈对齐到16个字节.x86_64 ISA指定在进入ISR时,我的堆栈是8字节对齐的.我需要将我的堆栈指针对齐到16个字节.问题是从我的C函数返回时,我必须恢复(可能)未对齐的堆栈指针,以便我可以正确地从我的中断返回.

我想知道是否有办法在不使用通用寄存器的情况下做到这一点?

caf*_*caf 9

这是我对问题的解决方案:

pushq %rsp
pushq (%rsp)
andq $-0x10, %rsp
    call function
movq 8(%rsp), %rsp
Run Code Online (Sandbox Code Playgroud)

两个推离开与同对准它原本和副本原件堆%rsp(%rsp)8(%rsp).在andq随后对齐堆栈-如果它已经是16种字节对齐没什么变化,如果是对齐8字节,然后它减去8 %rsp,这意味着原来%rsp现在是8(%rsp)16(%rsp).所以我们可以无条件地从中恢复它8(%rsp).