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の演習を行う準備ができた、、、かもしれない。