12

私はこのようなコードに出くわしました:

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

movl $1200, %ecxx86で何ができるか知っています。しかし、なぜ2パーセント記号があるのか​​混乱しました。

4

3 に答える 3

12

GCCインラインアセンブリは、%0、%1、%2などを使用して入力および出力オペランドを参照します。つまり、実際のレジスタには2つの%%を使用する必要があります。

優れた情報については、このハウツーを確認してください。

于 2013-02-07T07:16:17.053 に答える
8

場合によります

  • 文字列の後にコロンがある場合:、それは拡張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ははるかに強力であるため、より頻繁に使用されます。

于 2015-07-29T21:07:54.207 に答える
0

これは、GCCがオペランドとレジスタを区別するのに役立ちます。オペランドには、接頭辞として単一の%があります。'%%'は常にレジスタで使用されます。

于 2013-10-24T10:22:18.877 に答える