最終更新:2014-04-01 (火) 13:53:57 (3677d)  

インラインアセンブラ
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/インラインアセンブラ

  • キーワード
    • asm
    • __asm__ - asm が予約語や使用している関数とぶつかる場合などに使われ,一般的に __asm__ が使われる。
  • 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();で関数から戻る.

関連

参考