Condividi tramite


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

Vedi anche

Uso di C o C++ in blocchi __asm