这是我对问题的解决方案:
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).