首页 >后端开发 >C++ >使用基指针寄存器的 C 内联汇编如何避免函数调用开销?

使用基指针寄存器的 C 内联汇编如何避免函数调用开销?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-26 15:02:10515浏览

How Can C   Inline Assembly with the Base Pointer Register Avoid Function Call Overhead?

在 C 内联汇编中使用基指针寄存器避免函数调用开销

在 C 内联汇编中使用基指针寄存器 (%rbp) ,遵循这个更正后的代码代码片段:

void Foo(int &x) {
    int tmp;
    long tmplong;
    asm volatile(
        "lea -16 + %[mem1], %%rbp\n\t"
        "imul , %%rbp, %q[reg1]\n\t"  // Register allocated to tmplong
        "add %k[reg1], %k[reg1]\n\t"    // Register allocated to tmp
        "movl , %[mem1]\n\t" // Store value in memory pointed to by tmp
        : [mem1] "=&m"(tmp), [reg1] "=r"(tmplong)
        :
        : "%rbp"
    );
    x = 5;
}

解释:

  • 我们使用局部变量 tmp 作为内联 ASM 的缓冲区,而不是修改 %RSP 下面的红色区域.
  • 红色区域提供临时内存,通过%[mem1]访问,并引用%rbp(基指针寄存器)来计算正确的地址。
  • “=m”约束(内存操作数)确保编译器将tmp保存到%[mem1]指向的内存。
  • 编译器为 %[reg1] 分配寄存器。
  • “: %rbp”破坏列表通知编译器在内联汇编中修改 %rbp,使其能够恢复。

附加说明:

  • 保持内联汇编简单,主要用于说明编译器无法发出。使用约束而不是显式的 mov 指令。
  • 更喜欢在汇编中编写整个函数,而不是对函数序言和结尾使用内联汇编。
  • 考虑使用其他内联汇编资源,例如内联汇编标记 wiki和 GNU C 手册。

以上是使用基指针寄存器的 C 内联汇编如何避免函数调用开销?的详细内容。更多信息请关注PHP中文网其他相关文章!

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