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