Delen via


Toegang tot C- of C++-gegevens in __asm blokken

Microsoft-specifieke

Een groot gemak van inline-assembly is de mogelijkheid om te verwijzen naar C- of C++-variabelen op naam. Een __asm blok kan verwijzen naar alle symbolen, inclusief namen van variabelen, die binnen het bereik vallen waar het blok wordt weergegeven. Als de C-variabele var bijvoorbeeld binnen het bereik valt, wordt de instructie

__asm mov eax, var

slaat de waarde van var in EAX.

Als een klasse, structuur of union-lid een unieke naam heeft, kan een __asm blok ernaar verwijzen met alleen de lidnaam, zonder de variabele of typedef naam op te geven vóór de puntoperator (.). Als de lidnaam echter niet uniek is, moet u een variabele of typedef naam direct voor de puntoperator plaatsen. Bijvoorbeeld, de structuurtypen in het volgende voorbeeld delen same_name als hun lidnaam.

Als u variabelen declareert met de typen

struct first_type hal;
struct second_type oat;

alle verwijzingen naar het lid same_name moeten de naam van de variabele gebruiken, omdat same_name deze niet uniek is. Maar het lid weasel heeft een unieke naam, zodat u ernaar kunt verwijzen met alleen de naam van het lid:

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

Houd er rekening mee dat het weglaten van de naam van de variabele slechts een coderings gemak is. Dezelfde assembly-instructies worden gegenereerd, ongeacht of de naam van de variabele aanwezig is.

U kunt toegang krijgen tot gegevensleden in C++ zonder rekening te houden met toegangsbeperkingen. U kunt echter geen lidfuncties aanroepen.

Microsoft-specifieke beëindigen

Zie ook

C of C++ gebruiken in __asm blokken