Accès aux données C ou C++ dans les blocs __asm

Section spécifique à Microsoft

L'un des principaux avantages offerts par l'assembleur inline est la capacité à faire référence à des variables C ou C++ par nom. Un bloc __asm peut faire référence à n'importe quel symbole, y compris des noms de variables, qui figure dans la portée où le bloc apparaît. Par exemple, si la variable C var est dans la portée, l'instruction

__asm mov eax, var

stocke la valeur de var dans EAX.

Si un membre de classe, de structure ou d’union a un nom unique, un __asm bloc peut lui faire référence en utilisant uniquement le nom du membre, sans spécifier la variable ou typedef le nom avant l’opérateur point (.). En revanche, si le nom du membre n'est pas unique, vous devez placer une variable ou un nom typedef juste avant l'opérateur point. Par exemple, les types structure de l'exemple suivant partagent same_name comme nom de membre :

Si vous déclarez des variables avec les types

struct first_type hal;
struct second_type oat;

toutes les références au membre same_name doivent utiliser le nom de la variable, car same_name n'est pas unique. Cependant, le membre weasel ayant un nom unique, vous pouvez y faire référence en utilisant uniquement son nom de membre :

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

Notez que l'omission du nom de la variable est simplement une pratique de codage. Les mêmes instructions assembleur sont générées, que le nom de la variable soit présent ou non.

Vous pouvez accéder aux données membres en C++ sans tenir compte des restrictions d'accès. En revanche, vous ne pouvez pas appeler de fonctions membres.

FIN de la section spécifique à Microsoft

Voir aussi

Utilisation de C ou C++ dans les blocs __asm