Share via


__asm ブロックの C または C++ のデータへのアクセス

Microsoft 固有の仕様

インライン アセンブリの優れた利便性は、C または C++ の変数を名前で参照できることです。 __asm ブロックによって、ブロックが表示されているスコープ内の任意のシンボル (変数名を含む) を参照できます。 たとえば、C 変数 var がスコープ内にある場合、次の命令

__asm mov eax, var

によって、EAX で var の値が保存されます。

クラス、構造体、または共用体メンバーに一意の名前がある場合、ブロックは、__asmピリオド (.) 演算子の前に変数名またはtypedef名前を指定せずに、メンバー名のみを使用して参照できます。 ただし、メンバー名が一意でない場合は、変数または typedef の名前をピリオド演算子の直前に配置する必要があります。 たとえば、次のサンプルの構造体型では、same_name がメンバー名として共有されています。

型を使用して変数を宣言する場合

struct first_type hal;
struct second_type oat;

same_name が一意ではないため、メンバー same_name へのすべての参照で変数名を使用する必要があります。 しかし、メンバー weasel には一意の名前が付いているため、そのメンバー名のみを使用してそれを参照できます。

// InlineAssembler_Accessing_C_asm_Blocks.cpp
// processor: x86
#include <stdio.h>
struct first_type
{
   char *weasel;
   int same_name;
};

struct second_type
{
   int wonton;
   long same_name;
};

int main()
{
   struct first_type hal;
   struct second_type oat;

   __asm
   {
      lea ebx, hal
      mov ecx, [ebx]hal.same_name ; Must use 'hal'
      mov esi, [ebx].weasel       ; Can omit 'hal'
   }
   return 0;
}

変数名の省略は単なるコーディングの便宜上のものであることに注意してください。 変数名が存在するかどうかにかかわらず、同じアセンブリ命令が生成されます。

C++ では、アクセス制限に関係なく、データ メンバーにアクセスできます。 ただし、メンバー関数を呼び出すことはできません。

Microsoft 固有の仕様はここまで

関連項目

__asm ブロックでの C または C++ の使用