Accesso a dati C o C++ in blocchi __asm
Sezione specifica Microsoft
Una maggiore praticità di assembly inline consente di fare riferimento alle variabili C++ o C per nome. Un blocco __asm
può fare riferimento a qualsiasi simbolo, inclusi i nomi di variabili, che appartengono all'ambito in cui il blocco viene visualizzato. Ad esempio, se la variabile C var
è nell'ambito, l'istruzione
__asm mov eax, var
memorizza il valore di var
in EAX.
Se un membro di classe, struttura o unione ha un nome univoco, un __asm
blocco può farvi riferimento usando solo il nome del membro, senza specificare la variabile o typedef
il nome prima dell'operatore punto (.). Se il nome del membro non è univoco, tuttavia, è necessario inserire una variabile o un nome typedef
immediatamente prima dell'operatore punto. Ad esempio, i tipi di struttura nell'esempio seguente condividono same_name
come nome membro:.
Se si dichiarano variabili con i tipi
struct first_type hal;
struct second_type oat;
tutti i riferimenti al membro same_name
devono utilizzare il nome della variabile perché same_name
non è univoco. Ma il membro weasel
ha un nome univoco, in modo che sia possibile farvi riferimento utilizzando solo il nome membro:
// 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;
}
Si noti che omettere il nome della variabile è solo una comodità di codifica. Le stesse istruzioni dell'assembly vengono generate se il nome della variabile è presente o meno.
È possibile accedere ai membri dati in C++ indipendentemente dalle restrizioni di accesso. Tuttavia, non è possibile chiamare le funzioni membro.
Fine sezione specifica Microsoft