gccでインラインアセンブリするときの記法

gccインラインアセンブリ機能を利用しようとしたら、だいぶ記法が変態的(って言ったら怒られるかな^ー^;)だったのでメモ。

  1 #include <stdio.h>
  2 
  3 int main(int argc,char* argv[]){
  4         int a=10,b=0;
  5 
  6         printf("before:%d\n",b);
  7 
  8         //----memo----
  9         //通常のGASの構文では、レジスタを利用するためにプレフィックスとして
 10         //%を1つだけつける。
 11         //ところが、gccのインラインアセンブリの構文では、
 12         //C言語中で宣言された変数を利用するために、レジスタを利用する
 13         //プレフィックスを変更してあげる必要がある。具体的には、
 14         //      レジスタ:%%レジスタ名
 15         //      変数名  :%C言語中の変数名
 16         //となる。
 17         //
 18         //インラインアセンブリを使用するための記法は以下の通り:
 19         //      asm (   アセンブリテンプレート 
 20         //              : 出力オペランド
 21         //              : 入力オペランド 
 22         //              : 破壊されるレジスタのリスト
 23         //              );
 24         //
 25         //
 26         //各オペランドの構成要素は、
 27         //      :"オペランド制約文字式"(C言語中での変数名)
 28         //という記述で与えられる。
 29         //------------
 30 
 31         asm (   "movl   %1,%%eax\n\r"   //a->eax
 32                 "movl   %%eax,%0\n\r"   //eax->b
 33                 :"=r"   (b)             //%0を変数bと関連付け
 34                 :"r"    (a)             //%1を変数aと関連付け
 35                 :"%eax"                 //内容が破壊されるレジスタ
 36             );
 37 
 38         printf("after :%d\n",b);
 39 
 40         return 0;
 41 }

出力は以下のようになる。

before:0
after :10

これで始めて読む486の演習を行う準備ができた、、、かもしれない。