g ++寄存器分配

时间:2010-11-11 13:39:32

标签: c++ g++ cpu-registers

在调用函数时,g ++中有一种安全的方法可以强制变量在某个寄存器中吗?此函数包含内联asm代码,该代码假定某些寄存器中的输入。

我试图将局部变量声明为固定寄存器(register int x asm ("$10"))并将它们传递给函数,但是-O3将它弄乱了。

我不想通过在寄存器中声明全局变量来为整个程序保留寄存器。

4 个答案:

答案 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语句的函数中指定寄存器。