Uzyskiwanie dostępu do danych C lub C++ w blokach __asm

Specyficzne dla firmy Microsoft

Wielką wygodą wbudowanego zestawu jest możliwość odwoływania się do zmiennych C lub C++ według nazwy. Blok __asm może odwoływać się do dowolnych symboli, w tym nazw zmiennych, które znajdują się w zakresie, w którym pojawia się blok. Jeśli na przykład zmienna var C znajduje się w zakresie, instrukcja

__asm mov eax, var

przechowuje wartość var w programie EAX.

Jeśli klasa, struktura lub składowa unii ma unikatową nazwę, __asm blok może odwoływać się do niej przy użyciu tylko nazwy składowej, bez określania zmiennej lub typedef nazwy przed operatorem kropki (.). Jeśli nazwa elementu członkowskiego nie jest unikatowa, należy jednak umieścić zmienną lub typedef nazwę bezpośrednio przed operatorem kropki. Na przykład typy struktury w następującym przykładowym udziale same_name jako nazwa elementu członkowskiego:

W przypadku deklarowania zmiennych z typami

struct first_type hal;
struct second_type oat;

wszystkie odwołania do elementu członkowskiego same_name muszą używać nazwy zmiennej, ponieważ same_name nie jest unikatowa. Jednak członek weasel ma unikatową nazwę, więc można się do niego odwoływać przy użyciu tylko jego nazwy elementu członkowskiego:

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

Należy pamiętać, że pominięcie nazwy zmiennej jest tylko wygodą kodowania. Te same instrukcje dotyczące zestawu są generowane niezależnie od tego, czy nazwa zmiennej jest obecna.

Dostęp do elementów członkowskich danych w języku C++ można uzyskać bez względu na ograniczenia dostępu. Nie można jednak wywoływać funkcji składowych.

END Microsoft Specific

Zobacz też

Korzystanie z C lub C++ w blokach __asm