__asm
Microsoft 固有の仕様
__asm
キーワードは、インライン アセンブラーを呼び出し、C ステートメントまたは C++ ステートメントが有効である任意の場所に使用できます。 これは単独では表示できません。 この後にはアセンブリ命令、中かっこで囲まれた命令グループ、あるいは最低でも空の中かっこのペアが続いている必要があります。 "__asm
ブロック" という用語は、ここでは、中かっこに囲まれているかどうかを問わず、命令または命令のグループを示します。
Note
Visual C++ による標準 C++ の asm
キーワードのサポートには、コンパイラがキーワードに関するエラーを生成しないという制限があります。 ただし、asm
ブロックは意味のあるコードを生成しません。 asm
ではなく __asm
を使用します。
構文
asm-block:
__asm
assembly-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 break 命令に変換しました。
__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 固有の仕様はここまで