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

标签 c stack alignment x86-64

我正在为 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/

相关文章:

c - MPI 将非阻塞发送和接收与 C 中的 waitall 结合起来

c++ - 用于二进制分发的 clang 编译器标志(通用 CPU)

c++ - 如何在C/C++中保存数据?

c++ - 在 C++ 中堆叠/连接 2D vector

html - Div 与 YouTube 视频并排对齐

css - Bootstrap 3 表单复选框标签与 Chromium + Firefox 中的复选框输入不对齐

c++ - 询问 <strike>root</strike> 密码以获得所需的权限

使用堆栈和队列的 C++ 计算器

c - 堆栈是否持续增长?

image - 如何在 LaTeX 表格中将文本与图像垂直居中?