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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在gcc内联汇编中,双百分号(%%)有什么作用?相关的知识,希望对你有一定的参考价值。

我遇到了一个代码如下:

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

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

另一答案

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

以上是关于在gcc内联汇编中,双百分号(%%)有什么作用?的主要内容,如果未能解决你的问题,请参考以下文章

在 gcc 中访问内联汇编中的字符串的地址

Matlab中双百分号%%的用法及注意事项

Matlab中双百分号%%的用法及注意事项

操作系统学习之GCC内联汇编

这个 GCC 内联汇编中的参数列表有啥问题?

gcc中的arm内联汇编