Acceso a datos de C o C++ en bloques __asm
Específicos de Microsoft
Una gran ventaja del ensamblado insertado es la capacidad de hacer referencia a variables de C o C++ por nombre. Un bloque __asm
puede hacer referencia a cualquier símbolo, incluidos los nombres de variables que esté en el ámbito donde aparece el bloque. Por ejemplo, si la variable C var
está en el ámbito, la instrucción
__asm mov eax, var
almacena el valor de var
en EAX.
Si una clase, estructura o unión tiene un nombre único, un bloque __asm
puede hacer referencia al mismo solo con el nombre de miembro, sin especificar el nombre de variable o el nombre typedef
antes que el operador de punto (.). Si el nombre de miembro no es único, sin embargo, debe colocar una variable o un nombre typedef
inmediatamente antes del operador de punto. Por ejemplo, los tipos de estructura del ejemplo siguiente comparten same_name
como nombre de miembro:.
Si declara variables con los tipos
struct first_type hal;
struct second_type oat;
todas las referencias al miembro same_name
deben utilizar el nombre de variable porque same_name
no es único. Pero el miembro weasel
tiene un nombre único, por lo que se puede hacer referencia al mismo usando únicamente el nombre del miembro:
// 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;
}
Observe que la omisión del nombre de variable es cuestión simplemente de comodidad de codificación. Se generan las mismas instrucciones de ensamblado tanto si el nombre de variable está presente como si no.
Puede tener acceso a los miembros de datos de C++ sin tener en cuenta las restricciones de acceso. Sin embargo, no se puede llamar a funciones miembro.
FIN de Específicos de Microsoft