Microsoft 固有の仕様Microsoft Specific

__asm キーワードは、インライン アセンブラーを呼び出し、C ステートメントまたは C++ ステートメントが有効である任意の場所に使用できます。The __asm keyword invokes the inline assembler and can appear wherever a C or C++ statement is legal. これは、単独では使用できません。It cannot appear by itself. アセンブリ命令、中かっこで囲まれた命令グループ、または少なくとも空の中かっこの後で指定する必要があります。It must be followed by an assembly instruction, a group of instructions enclosed in braces, or, at the very least, an empty pair of braces. "__asm ブロック" という用語は、ここでは、中かっこに囲まれているかどうかを問わず、命令または命令のグループを示します。The term "__asm block" here refers to any instruction or group of instructions, whether or not in braces.


Visual C++ による標準 C++ の asm キーワードのサポートには、コンパイラがキーワードに関するエラーを生成しないという制限があります。Visual C++ support for the Standard C++ asm keyword is limited to the fact that the compiler will not generate an error on the keyword. ただし、asm ブロックは意味のあるコードを生成しません。However, an asm block will not generate any meaningful code. __asm の代わりに asmを使用します。Use __asm instead of asm.


asm ブロック:asm-block:
    __asm assembly-instruction ;opt    __asm assembly-instruction ;opt
    __asm { assembly-instruction-list } ;opt    __asm { assembly-instruction-list } ;opt

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


中かっこを付けないで使用する場合、__asm キーワードは、行の残りの部分がアセンブリ言語のステートメントであることを意味します。If used without braces, the __asm keyword means that the rest of the line is an assembly-language statement. 中かっこを付けて使用する場合、中かっこの間の各行がアセンブリ言語のステートメントであることを意味します。If used with braces, it means that each line between the braces is an assembly-language statement. 以前のバージョンとの互換性を維持するため、_asm__asm のシノニムとなっています。For compatibility with previous versions, _asm is a synonym for __asm.

__asm キーワードはステートメント区切り文字であるため、アセンブリ命令も同じ行に記述できます。Since the __asm keyword is a statement separator, you can put assembly instructions on the same line.

Visual Studio 2005 で命令する前にBefore Visual Studio 2005, the instruction

__asm int 3

ネイティブでコンパイルした場合に生成されるコードが発生しなかった /clr; コンパイラが CLR break 命令を命令を変換します。did not cause native code to be generated when compiled with /clr; the compiler translated the instruction to a CLR break instruction.

__asm int 3 により現在は、関数のネイティブ コードが生成されるようになりました。__asm int 3 now results in native code generation for the function. 場合は、コードでブレークポイントが発生してする場合は、MSIL にコンパイルされた関数を使用する関数_ _debugbreakします。If you want a function to cause a break point in your code and if you want that function compiled to MSIL, use __debugbreak.

以前のバージョンとの互換性のため _asmのシノニムです _ _asmしない限り、コンパイラ オプション/Za(言語拡張機能を無効にする)を指定します。For compatibility with previous versions, _asm is a synonym for __asm unless compiler option /Za (Disable language extensions) is specified.


次のコード片は、中かっこで囲まれた単純な __asm ブロックです。The following code fragment is a simple __asm block enclosed in braces:

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

または、各アセンブリ命令の前に __asm を置くことができます。Alternatively, you can put __asm in front of each assembly instruction:

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

__asm キーワードはステートメント区切り文字であるため、アセンブリ命令も同じ行に記述できます。Because the __asm keyword is a statement separator, you can also put assembly instructions on the same line:

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

これらの 3 つの例ではいずれも同じコードが生成されますが、最初のスタイル (中かっこで __asm ブロックを囲む) にはいくつかの利点があります。All three examples generate the same code, but the first style (enclosing the __asm block in braces) has some advantages. 中かっこにより、C または C++ コードからアセンブリ コードが明確に分離され、__asm キーワードの不要な繰り返しが避けられます。The braces clearly separate assembly code from C or C++ code and avoid needless repetition of the __asm keyword. 中かっこにより、あいまいさを防ぐこともできます。Braces can also prevent ambiguities. C または C++ ステートメントを __asm ブロックと同じ行に記述する場合は、そのブロックを中かっこで囲む必要があります。If you want to put a C or C++ statement on the same line as an __asm block, you must enclose the block in braces. 中かっこで囲まないと、コンパイラはどこでアセンブリ コードが終わって C または C++ ステートメントが始まるかがわかりません。Without the braces, the compiler cannot tell where assembly code stops and C or C++ statements begin. 最後に、中かっこ内のテキストは、通常の MASM テキストと同じ形式であるため、既存の MASM ソース ファイルからテキストを簡単に切り取って貼り付けることができます。Finally, because the text in braces has the same format as ordinary MASM text, you can easily cut and paste text from existing MASM source files.

C および C++ での中かっこと異なり、__asm ブロックを囲む中かっこは、変数のスコープに影響を与えません。Unlike braces in C and C++, the braces enclosing an __asm block don't affect variable scope. また、__asm ブロックを入れ子にすることもできます。入れ子にしても、変数のスコープは影響を受けません。You can also nest __asm blocks; nesting does not affect variable scope.

Microsoft 固有の仕様はここまでEND Microsoft Specific

関連項目See also

インライン アセンブラーInline Assembler