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

问题描述 投票:11回答:3

我遇到了一个代码如下:

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

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

c gcc x86
3个回答
9
投票

GCC内联汇编使用%0,%1,%2等来表示输入和输出操作数。这意味着你需要使用两个%%来实现真正的寄存器。

查看此howto以获取更多信息。


8
投票

这取决于

  • 如果字符串后面有一个冒号:,那么它就是一个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);
  • 否则,它将是一个编译时错误,因为没有冒号它是一个basic asm不支持变量约束,不需要或支持转义%1。例如。: asm volatile ("movl $1200, %ecx;"); 工作得很好。

扩展的asm更常用,因为它更强大。


0
投票

这有助于GCC区分操作数和寄存器。操作数具有单个%作为前缀。 '%%'总是与寄存器一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.