__asm ブロックの C または C++ のデータへのアクセスAccessing C or C++ Data in __asm Blocks

Microsoft 固有の仕様Microsoft Specific

インラインアセンブリの優れた利便性は、C または C++ の変数を名前で参照できることです。A great convenience of inline assembly is the ability to refer to C or C++ variables by name. ブロックは、 __asm ブロックが表示されているスコープ内の任意のシンボル (変数名を含む) を参照できます。An __asm block can refer to any symbols, including variable names, that are in scope where the block appears. たとえば、C 変数 var がスコープ内にある場合、命令For instance, if the C variable var is in scope, the instruction

__asm mov eax, var

の値を var EAX に格納します。stores the value of var in EAX.

クラス、構造体、または共用体のメンバーに一意の名前がある場合、ブロックは、 __asm typedef ピリオド (.) 演算子の前に変数または名前を指定せずに、メンバー名のみを使用して参照できます。If a class, structure, or union member has a unique name, an __asm block can refer to it using only the member name, without specifying the variable or typedef name before the period (.) operator. ただし、メンバー名が一意でない場合は、変数または名前をピリオド演算子の直前に配置する必要があり typedef ます。If the member name is not unique, however, you must place a variable or typedef name immediately before the period operator. たとえば、次の例では、という名前の構造体が same_name メンバー名として共有されています。For example, the structure types in the following sample share same_name as their member name:.

型を使用して変数を宣言する場合If you declare variables with the types

struct first_type hal;
struct second_type oat;

が一意ではないため、メンバーへのすべての参照で same_name 変数名を使用する必要があり same_name ます。all references to the member same_name must use the variable name because same_name is not unique. ただし、メンバーには weasel 一意の名前が付いているため、メンバー名のみを使用して参照できます。But the member weasel has a unique name, so you can refer to it using only its member name:

// 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;
}

変数名の省略は単なるコーディングの便宜であることに注意してください。Note that omitting the variable name is merely a coding convenience. 変数名が存在するかどうかにかかわらず、同じアセンブリ命令が生成されます。The same assembly instructions are generated whether or not the variable name is present.

アクセス制限に関係なく、C++ のデータメンバーにアクセスできます。You can access data members in C++ without regard to access restrictions. ただし、メンバー関数を呼び出すことはできません。However, you cannot call member functions.

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

関連項目See also

__Asm ブロックでの C または C++ の使用Using C or C++ in __asm Blocks