__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 中断命令に変換しました。
__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 固有の仕様はここまで
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示