Share via


__asm ブロックの C マクロとしての定義

Microsoft 固有の仕様 →

C のマクロは、ソース・コードのアセンブリ コードを挿入するための便利な方法を提供します。ただし、マクロが単一の論理行に展開するため、特別な注意が必要です。 トラブルのフリー マクロを作成するには、次の規則に従います。:

  • 中かっこで __asm ブロックに記述します。

  • 各アセンブリ命令の前の __asm キーワードを配置します。

  • アセンブリ スタイル comment (; comment) または単一行コメントの C (// comment) の代わりに、旧形式の C comment (/* comment */) を使用します。

説明するには、次の例では、単純なマクロを定義し、T:

#define PORTIO __asm      \
/* Port output */         \
{                         \
   __asm mov al, 2        \
   __asm mov dx, 0xD007   \
   __asm out dx, al       \
}

一見すると、__asm の最後の 3 つがキーワードが過度に似ています。 ただし、マクロが単一行に展開されるためです:

__asm /* Port output */ { __asm mov al, 2  __asm mov dx, 0xD007 __asm out dx, al }

__asm の 3 番目と 4 番目のキーワードはステートメントの区切り記号として使用する必要があります。 __asm ブロックで認識される唯一のステートメントの区切り記号は __asm の改行文字とキーワードです。 マクロで定義されたブロックが 1 台の論理行であるため、__asmの各手順を分けなければ必要があります。

中かっこも必要です。 これらを省略すると、コンパイラはマクロの呼び出しの右側に同じ行の C または C++ のステートメントとは異なるできます。 右中かっこ (}) があると、コンパイラはアセンブリ コードが停止する、アセンブリ命令に C または C++ のステートメントの後 __asm ブロック参照したかを示すことができなくなります。

アセンブリ スタイルは、最初の行の末尾にセミコロン (###;) をコメント アウトします。 これは、マクロ内の論理行の末尾にコンパイラがコメントの後にすべてを無視するため、その問題を引き起こす可能性があります。 これは、一方向 C または C++ Comments (// comment) にも当てはまります。 エラーを回避するには、マクロとして定義されます __asm ブロックで、旧形式の C comment (/* comment */) を使用します。

C++.マクロとして記述する __asm ブロックに引数を受け取ることができます。 ただし、通常の C マクロとは異なり __asm マクロは値を返すことができません。 C または C++ の式でこのようなマクロを使用できません。

この型のマクロを無差別に呼び出すように注意してください。 たとえば、__fastcall の規約で宣言された関数のアセンブリ言語マクロを呼び出すと、予期しない結果になることがあります。(レジスタをインライン アセンブリで使用し、維持します。を参照してください)。

END Microsoft 固有の仕様

参照

関連項目

インライン アセンブラー