提问者:小点点

内联程序集:注册引用约定


在网上找到的gcc内联汇编示例中,我看到寄存器名称有时被引用为单个%,有时被引用为两个(即%%)。不清楚何时使用单个%以及何时使用%%。例如,请参阅下面的示例。

/* Do b = a */

  int a=10, b;

  asm ("movl %1, %%eax;\n"
       "movl %%eax, %0;"
       : "=r" (b)        /* output */
       : "r" (a)         /* input */
       : "%eax"          /* clobbered register */
       );

这个使用%%前缀作为EAX寄存器的例子在我的x86机器上编译得很好(LinuxRedHat 5.6(Tikanga 2.6.18-238.5.1. el5x86_64,内核2.6.18,gcc 4.7.2)。但是下面的单行代码

asm ("movl %%ecx, %%eax");

产生下面的错误。

a.c: Assembler messages:

a.c:14: Error: bad register name `%%ecx'

有人能解释一下什么时候使用%以及什么时候使用%%吗?

谢谢你。


共1个答案

匿名用户

asm的主体(即实际代码所在的部分)中,您可以使用%1%2等来引用inline-asm块的参数。为此,inline-asm将%视为特殊字符。

在您的第二个示例中,内联汇编器没有参数。没有%1…替换说明符,因此您不需要将%加倍。

像泥一样清晰?