__asm

Microsoft 固有の仕様

__asm キーワードは、インライン アセンブラーを呼び出し、C ステートメントまたは C++ ステートメントが有効である任意の場所に使用できます。 単独では表示できません。 アセンブリ命令、中かっこで囲まれた命令のグループ、または少なくとも空の中かっこのペアが続く必要があります。 "__asm ブロック" という用語は、ここでは、中かっこに囲まれているかどうかを問わず、命令または命令のグループを示します。

Note

Visual C++ による標準 C++ の asm キーワードのサポートには、コンパイラがキーワードに関するエラーを生成しないという制限があります。 ただし、asm ブロックは意味のあるコードを生成しません。 asm ではなく __asm を使用します。

構文

asm-block:
__asmassembly-instruction;opt
__asm {assembly-instruction-list};opt

assembly-instruction-list:
assembly-instruction;opt
assembly-instruction;assembly-instruction-list;opt

解説

中かっこを付けないで使用する場合、__asm キーワードは、行の残りの部分がアセンブリ言語のステートメントであることを意味します。 中かっこを付けて使用する場合、中かっこの間の各行がアセンブリ言語のステートメントであることを意味します。 以前のバージョンとの互換性を維持するため、_asm__asm のシノニムとなっています。

__asm キーワードはステートメント区切り文字であるため、アセンブリ命令も同じ行に記述できます。

Visual Studio 2005 より前は、次の命令

__asm int 3

/clr を使用してコンパイルしたときにネイティブ コードが生成されませんでした。コンパイラは命令を CLR 中断命令に変換しました。

__asm int 3 により現在は、関数のネイティブ コードが生成されるようになりました。 コード内で関数にブレーク ポイントを設定する場合や、その関数を MSIL にコンパイルする場合は、__debugbreak を使用します。

以前のバージョンとの互換性を確保するため、_asm は、コンパイラ オプション /Za (言語拡張機能の無効化) が指定されていない限り、__asm のシノニムです。

次のコード片は、中かっこで囲まれた単純な __asm ブロックです。

__asm {
   mov al, 2
   mov dx, 0xD007
   out dx, al
}

または、各アセンブリ命令の前に __asm を置くことができます。

__asm mov al, 2
__asm mov dx, 0xD007
__asm out dx, al

__asm キーワードはステートメント区切り文字であるため、アセンブリ命令も同じ行に記述できます。

__asm mov al, 2   __asm mov dx, 0xD007   __asm out dx, al

これらの 3 つの例ではいずれも同じコードが生成されますが、最初のスタイル (中かっこで __asm ブロックを囲む) にはいくつかの利点があります。 中かっこにより、C または C++ コードからアセンブリ コードが明確に分離され、__asm キーワードの不要な繰り返しが避けられます。 中かっこにより、あいまいさを防ぐこともできます。 C または C++ ステートメントを __asm ブロックと同じ行に記述する場合は、そのブロックを中かっこで囲む必要があります。 中かっこがないと、コンパイラはアセンブリ コードがどこで停止し、C または C++ ステートメントが開始されるかを特定できません。 最後に、中かっこ内のテキストは、通常の MASM テキストと同じ形式であるため、既存の MASM ソース ファイルからテキストを簡単に切り取って貼り付けることができます。

C および C++ での中かっこと異なり、__asm ブロックを囲む中かっこは、変数のスコープに影響を与えません。 ブロックを入れ子 __asm にすることもできます。入れ子は変数スコープには影響しません。

Microsoft 固有の仕様はここまで

関連項目

キーワード
インライン アセンブラー