最終更新:2014-04-01 (火) 13:53:57 (3650d)
インラインアセンブラ
Top / インラインアセンブラ
コンパイラ別
Visual C++/インラインアセンブラ
- キーワード
- __asm - VC++専用のMicrosoft独自のキーワード
__asm アセンブリ文 __asm { アセンブリ文のリスト }
- Intel構文
Op-code dst src int sum(int a, int b) { __asm{ mov eax, a add eax, b }; }
- 返り値はeaxに代入する
GCC/インラインアセンブラ
- キーワード
- AT&T構文
- メモ
- レジスタは%をつける
- 数値は先頭に$マークを付ける
asm( アセンブラテンプレート : 出力オペランド : 入力オペランド : ワークレジスタ);
Op-code src dst int add(int a, int b) { int ret; asm("movl %0, %%eax"::"g"(a)); asm("movl %0, %%ecx"::"g"(b)); asm("addl %ecx, %eax"); asm("movl %%eax, %0":"=g"(ret)); return ret; }
Cから呼び出される関数
- 返り値はeaxに代入する(返り値がvoidならeaxの値は不定).
- 汎用レジスタのうちebx?, esi?, edi?, ebp?, esp?の値は関数を抜けるときに呼び出されたときの状態に戻す.ecx, edxの値を保存する必要はない.
- ret();で関数から戻る.