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