Acessando dados C ou C++ em blocos __asm
Seção específica da Microsoft
Uma grande conveniência do assembly embutido é a capacidade de fazer referência a variáveis C ou C++ pelo nome. Um bloco __asm
pode fazer referência a todos os símbolos, incluindo nomes de variáveis, que estão no escopo em que o bloco é exibido. Por exemplo, se a variável C var
estiver no escopo, a instrução
__asm mov eax, var
armazenará o valor de var
no EAX.
Se um membro de classe, estrutura ou união tiver um nome exclusivo, um bloco __asm
poderá fazer referência a ele usando apenas o nome do membro, sem especificar a variável ou o nome typedef
antes do operador de período (.). No entanto, se o nome do membro não for exclusivo, será necessário colocar uma variável ou um nome typedef
imediatamente antes do operador de período. Por exemplo, os tipos de estrutura no exemplo a seguir compartilham same_name
como nome de membro:.
Se você declarar variáveis com os tipos
struct first_type hal;
struct second_type oat;
todas as referências ao membro same_name
deverão usar o nome da variável porque same_name
não é exclusiva. Mas o membro weasel
tem um nome exclusivo, portanto, é possível fazer referência a ele usando apenas o nome do 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;
}
Observe que omitir o nome da variável é apenas uma conveniência de codificação. As mesmas instruções de assembly são geradas se o nome da variável está presente ou não.
É possível acessar membros de dados no C++ sem considerar as restrições de acesso. No entanto, não é possível chamar funções de membro.
Fim da seção específica da Microsoft