当使用内联汇编访问 C 中的基指针寄存器 (%rbp) 时函数,访问该函数后发生意外的段错误
问题在于踩到RSP(或减法指针)下方的“红色区域”,该区域存储GCC需要跟踪的值。在提供的示例代码中,在内联汇编中使用了推送指令,该指令将 %rsp 递减 8 并覆盖函数参数的低 32 位 (&x)。
当内联汇编完成时,GCC尝试使用破坏的值作为 4 字节存储的地址,导致 seg
此问题主要有以下三种解决方案:
不要使用红色区域溢出,而是考虑使用“=m”约束在内联程序集中显式分配工作空间,如以下是更正后的代码示例:
void Bar(int &x) { int tmp; long tmplong; asm ("lea -16 + %[mem1], %%rbp\n\t" "imul , %%rbp, %q[reg1]\n\t" // q modifier: 64bit name. "add %k[reg1], %k[reg1]\n\t" // k modifier: 32bit name "movl , %[mem1]\n\t" // some asm instruction writing to mem : [mem1] "=m" (tmp), [reg1] "=r" (tmplong) : : "%rbp" ); x = 5; }
这里,“=m”约束确保工作空间分配在红色区域内,并避免覆盖函数参数。
以上是为什么在 C 内联汇编中使用基指针 (%rbp) 会导致段错误?的详细内容。更多信息请关注PHP中文网其他相关文章!