私はこのようなコードに出くわしました:
asm volatile (
# [...]
"movl $1200, %%ecx;"
# [...]
);
movl $1200, %ecx
x86で何ができるか知っています。しかし、なぜ2パーセント記号があるのか混乱しました。
GCCインラインアセンブリは、%0、%1、%2などを使用して入力および出力オペランドを参照します。つまり、実際のレジスタには2つの%%を使用する必要があります。
優れた情報については、このハウツーを確認してください。
場合によります
文字列の後にコロンがある場合:
、それは拡張asmであり、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);
それ以外の場合は、コンパイル時エラーになります。これは、コロンがないと、変数の制約をサポートせず、エスケープを必要としない、またはサポートしない基本的なasm%1
であるためです。例えば:
asm volatile ("movl $1200, %ecx;");
うまく動作します。
拡張asmははるかに強力であるため、より頻繁に使用されます。
これは、GCCがオペランドとレジスタを区別するのに役立ちます。オペランドには、接頭辞として単一の%があります。'%%'は常にレジスタで使用されます。