首页 >后端开发 >C++ >为什么使用基指针寄存器 (%rbp) 的内联汇编会导致 C 中的段错误?

为什么使用基指针寄存器 (%rbp) 的内联汇编会导致 C 中的段错误?

Patricia Arquette
Patricia Arquette原创
2024-12-28 02:17:10599浏览

Why Does My Inline Assembly Using the Base Pointer Register (%rbp) Cause a Seg Fault in C  ?

在 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 的最佳实践:

  • 保持内联ASM 尽可能简洁,最好只包含编译器无法生成的指令。
  • 使用输入/输出约束来指定流程ASM 和 C 代码之间的数据。
  • 避免对大型代码块使用内联 ASM。考虑编写汇编函数。

其他提示:

  • 使用内联 ASM 时,请注意堆栈下方的“红色区域”区域指针。
  • 输入约束可用于指定输入的寄存器,减少显式寄存器的需要分配。
  • 如果您的代码修改了标志,请声明“cc”(条件代码)破坏者。

以上是为什么使用基指针寄存器 (%rbp) 的内联汇编会导致 C 中的段错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn