在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内联汇编中,双百分号(%%)有什么作用?的主要内容,如果未能解决你的问题,请参考以下文章