次の方法で共有


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

Microsoft 固有の仕様 →

インライン アセンブラー コードの関数を記述する場合は、引数を関数に渡し、そこから値を返す方法が簡単です。 次の例では、まず別のアセンブリに書き込まれ、インライン アセンブラーのように書き直す関数を比較します。 power2と呼ばれる関数は、2 番目の処理能力に 2 で最初のパラメーターを増やす 2 個のパラメーターを受け取ります。 別のアセンブリに伴って、関数は次のようになります。:

; POWER.ASM
; Compute the power of an integer
;
       PUBLIC _power2
_TEXT SEGMENT WORD PUBLIC 'CODE'
_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+4] ; Get first argument
        mov ecx, [ebp+6] ; Get second argument
        shl eax, cl     ; EAX = EAX * ( 2 ^ CL )
        pop ebp         ; Restore EBP
        ret             ; Return with sum in EAX

_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 のインライン バージョンは、. return のステートメントを実行しないので、警告レベル 2 で以上のコンパイルすると思われる警告が表示されます。 関数は値を返す、コンパイラは return のステートメントがないときに通知することはできません。 この警告の生成を無効にするために #pragma warning を使用できます。

END Microsoft 固有の仕様

参照

関連項目

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