次の方法で共有


__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 固有の仕様はここまで

関連項目

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