在gcc内联汇编中,双百分号(%%)有什么作用?

时间:2013-02-07 07:13:55

标签: c gcc x86

我遇到了一个看起来像这样的代码:

asm volatile (
    # [...]
    "movl $1200, %%ecx;"
    # [...]
);

我知道x86中movl $1200, %ecx的作用。但我很困惑为什么有两个百分号。

3 个答案:

答案 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区分操作数和寄存器。操作数具有单个%作为前缀。 ' %%'总是与寄存器一起使用。