我遇到了一个代码如下:
asm volatile (
# [...]
"movl $1200, %%ecx;"
# [...]
);
我知道movl $1200, %ecx
在x86中的作用。但我很困惑为什么有两个百分号。
GCC内联汇编使用%0,%1,%2等来表示输入和输出操作数。这意味着你需要使用两个%%来实现真正的寄存器。
查看此howto以获取更多信息。
这取决于
:
,那么它就是一个extended asm,并且%%
逃脱了可能具有特殊意义as mentioned by Carl的百分比。例:
uint32_t in = 1;
uint32_t out = 0;
asm volatile (
"movl %1, %%eax;"
"inc %%eax;"
"movl %%eax, %0"
: "=m" (out) /* Outputs. '=' means written to. */
: "m" (in) /* Inputs. No '='. */
: "%eax"
);
assert(out == in + 1);
%1
。例如。:
asm volatile ("movl $1200, %ecx;");
工作得很好。扩展的asm更常用,因为它更强大。
这有助于GCC区分操作数和寄存器。操作数具有单个%作为前缀。 '%%'总是与寄存器一起使用。