在 C 内联 ASM 中使用基指针寄存器
问题:
我正在尝试在内联汇编中使用基址指针寄存器 (%rbp)。但是,当我在内联汇编之后访问变量时,程序段错误。下面的代码片段说明了该问题:
void Foo(int &x) { asm volatile ("pushq %%rbp;" "movq %%rsp, %%rbp;" "subq , %%rsp;" "movl , -12(%%rbp);" "movq %%rbp, %%rsp;" "popq %%rbp;" : : : ); x = 5; }
问题诊断:
代码段错误,因为它覆盖了 RSP 下面“红色区域”中存储的值,GCC 使用它来存储
解决方案:
要避免此问题,请使用“=m”输出操作数为内联汇编分配暂存空间,或使用显式跳过红色区域sub $-128, %rsp 指令。或者,首先避免使用暂存空间,让编译器为您分配和保存寄存器。
内联 ASM 的最佳实践:
其他提示:
以上是为什么使用基指针寄存器 (%rbp) 的内联汇编会导致 C 中的段错误?的详细内容。更多信息请关注PHP中文网其他相关文章!