
在 C 内联汇编中使用基指针寄存器避免函数调用开销
在 C 内联汇编中使用基指针寄存器 (%rbp) ,遵循这个更正后的代码代码片段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void Foo(int &x) {
int tmp;
long tmplong;
asm volatile(
"lea -16 + %[mem1], %%rbp\n\t"
"imul , %%rbp, %q[reg1]\n\t"
"add %k[reg1], %k[reg1]\n\t"
"movl , %[mem1]\n\t"
: [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中文网其他相关文章!