在调用函数时,g ++中有一种安全的方法可以强制变量在某个寄存器中吗?此函数包含内联asm代码,该代码假定某些寄存器中的输入。
我试图将局部变量声明为固定寄存器(register int x asm ("$10")
)并将它们传递给函数,但是-O3
将它弄乱了。
我不想通过在寄存器中声明全局变量来为整个程序保留寄存器。
答案 0 :(得分:1)
我希望函数的参数能够在寄存器中传递,你可以这样做:
int __attribute__((fastcall)) foo(register int a, register int b)
{
return a + b;
}
__attribute__((fastcall))
表示该函数的前两个参数分别在ECX和EDX中传递。register
关键字用于防止GCC在输入函数后将参数复制到堆栈。我发现这可以在不同-O
级别上可靠地工作。
答案 1 :(得分:0)
使用asm volatile
内联汇编块,如this page中所述。
答案 2 :(得分:0)
您可以使用扩展程序集。 这适用于gcc,应该可以正常工作:http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html 您可以使用将由所需变量填充的输入寄存器。 或者您可以直接通过内联asm代码中的名称来引用C ++变量。
答案 3 :(得分:0)
将使用显式寄存器声明的变量直接传递给内联asm语句;必须在包含asm语句的函数中指定寄存器。