最終更新:2014-04-01 (火) 16:27:32 (3675d)  

GCC/インラインアセンブラ
Top / GCC / インラインアセンブラ

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

asm( アセンブラテンプレート
    : 出力オペランド
    : 入力オペランド
    : ワークレジスタ);

  • x の値を変数 y へコピー
    __asm__("mov %0, %1"
    : "=r" (y)
    :"r" (x)
    :
    );

アセンブラテンプレート

  • アセンブラ命令を文字列リテラルで定義している。出力・入力オペランドで宣言した n 番目のオペランドには %n という名前でアクセスできる。
    "mov %0, %1"
  • アセンブラ命令はそれぞれを改行かセミコロンで区切る必要がある

オペランド

出力オペランド

  • コンマで区切られた出力オペランドリストを定義する。それぞれのエントリーはダブルクオートで囲まれたオペランド制約と括弧で囲まれた C の式を持つ。
    "=r" (y)

入力オペランド

  • コンマで区切られた入力オペランドリストを定義する。構文は出力オペランドと同じ。
    "r" (x)

ワークレジスタ

  • ワークレジスタリストを定義する。
  • 退避処理が必要であることをGCCに教える
  • ワークレジスタリストで宣言されたレジスタはどの出力・入力オペランドにも割り当てられないことが保障され,アセンブラコードで自由に読み書きできる。
  • メモリを使うときはmemory

用語

オペランド制約

  • "オペランド制約" (Cの式)
  • "=r","r" を使用すれば GCC は自由に任意のレジスタをアセンブラコードで使うために割り当て,そのレジスタはそれぞれ指定された C の変数の書き込み・読み込みに使用される。

制約文字

  • オペランドがどのレジスタを使用するかを指定する
    制約文字制約内容
    r汎用レジスタの中から自動で割り当てる

制約修飾子

  • =とか+とか&
    制約文字制約内容詳細
    (無し)読み込み専用オペランドアセンブラコードで変更されないと想定する ― 値を変更することは許されない
    =書き込み専用オペランド入力オペランドがすべて使い切ってから変更されると想定する ― 入力オペランドが使い終わった後であれば自由に値を変更できる
    +読み込み・書き込みオペランドどこでも値を変更可能(インクリメントとかで使う)
    &早期破壊オペランドどこでも値を変更可能 ― 早期破壊オペランドであることを示すだけなので,一般に = とセットで =& として使われる。どんな入力オペランドとも同じレジスタを使用しないことが保障される
  • m - 直接メモリへアクセス

マッチング制約

  • オペランド制約に定数 n を宣言すれば,そのオペランドは n 番目のオペランドと同じレジスタを使用する。
  • 制約文字に数字を使うのは入力オペランドのみ

参考