インライン アセンブリでの関数の記述
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 固有の仕様はここまで