我遇到了一个看起来像这样的代码:
asm volatile (
# [...]
"movl $1200, %%ecx;"
# [...]
);
我知道x86中movl $1200, %ecx
的作用。但我很困惑为什么有两个百分号。
答案 0 :(得分:10)
GCC内联汇编使用%0,%1,%2等来表示输入和输出操作数。这意味着你需要使用两个%%来实现真正的寄存器。
查看此howto以获取重要信息。
答案 1 :(得分:8)
取决于
如果字符串后面有冒号QObject
,那么它是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);
。 E.g:
%1
工作得很好。
扩展的asm更常用,因为它更强大。
答案 2 :(得分:0)
这有助于GCC区分操作数和寄存器。操作数具有单个%作为前缀。 ' %%'总是与寄存器一起使用。