在网上找到的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'
有人能解释一下什么时候使用%
以及什么时候使用%%
吗?
谢谢你。
在asm
的主体(即实际代码所在的部分)中,您可以使用%1
、%2
等来引用inline-asm块的参数。为此,inline-asm将%
视为特殊字符。
在您的第二个示例中,内联汇编器没有参数。没有%1
…替换说明符,因此您不需要将%
加倍。
像泥一样清晰?