次の方法で共有


インライン アセンブリでの関数の記述

Microsoft 固有の仕様

Note

インライン アセンブリは x86 ターゲットでのみ使用できます。 X64 または ARM64 でのコードと同様の機能については、 コンパイラの組み込みを使用します。

インライン アセンブリ コードを使用して関数を記述する場合は、関数に引数を渡して、そこから値を返すのが簡単です。 次の例では、別のアセンブラー用に最初に記述された関数と、インライン アセンブラー用に書き直したものが比較されます。 power2 という関数は、2 つのパラメーターを受け取り、最初のパラメーターに 2 を乗算し、2 番目のパラメーターのべき乗を返します。 別のアセンブラー ファイルとしては、関数は次のようになります。

; power2.asm 
; x86 code for C interop
; Command line: ml /c /Cx /W3 /WX power2.asm 
        .686P
        .XMM
        .MODEL  flat

PUBLIC  _power2
; int power2(int num, int power);
; computes num x 2^power
_TEXT   SEGMENT
_power2 PROC
        push    ebp             ; save EBP
        mov     ebp, esp        ; Move ESP into EBP so we can refer
                                ;   to arguments on the stack
        mov     eax, [ebp+8]    ; load first argument
        mov     ecx, [ebp+12]   ; load second argument
        shl     eax, cl         ; compute result in EAX
        pop     ebp             ; restore EBP
        ret
_power2 ENDP
_TEXT   ENDS
END

別のアセンブラー ファイルとして記述されているため、この関数には別のアセンブリとリンクのステップが必要です。 通常、C および C++ の関数の引数はスタックで渡されるので、このバージョンの power2 関数は、スタック上の位置で引数にアクセスします。 (MASM およびその他のアセンブラーで使用できる MODEL ディレクティブでも、スタック引数とローカル スタック変数に名前でアクセスできます)

このプログラムによって、インライン アセンブリ コードを使用して power2 関数が記述されます。

// Power2_inline_asm.c
// compile with: /EHsc
// processor: x86

#include <stdio.h>

int power2( int num, int power );

int main( void )
{
    printf_s( "3 times 2 to the power of 5 is %d\n", \
              power2( 3, 5) );
}
int power2( int num, int power )
{
   __asm
   {
      mov eax, num    ; Get first argument
      mov ecx, power  ; Get second argument
      shl eax, cl     ; EAX = EAX * ( 2 to the power of CL )
   }
   // Return with result in EAX
}

power2 関数のインライン バージョンでは、その引数が名前で参照され、プログラムの残りの部分と同じソース ファイルに存在します。 このバージョンでは、必要なアセンブリ命令も少なくなっています。

power2 のインライン バージョンでは、C の return ステートメントが実行されないため、警告レベル 2 以上でコンパイルした場合、無害な警告が発生します。 関数からは値が返されますが、コンパイラでは、return ステートメントが存在しない状況では、値が返されることを認識できません。 #pragma warningを使用して、この警告の生成を無効にすることができます。

Microsoft 固有の仕様はここまで

関連項目

__asm ブロックでの C または C++ の使用Blocks