__asm

Section spécifique à Microsoft

Le mot clé __asm appelle l'assembleur inline et peut apparaître partout où une instruction C ou C++ est conforme. Elle ne peut pas apparaître elle-même. Elle doit être suivie d’une instruction d’assembly, d’un groupe d’instructions placées entre accolades ou, au minimum, d’une paire vide d’accolades. Le terme « bloc __asm  » fait ici référence à une instruction ou un groupe d'instructions, que ce dernier soit ou non entouré d'accolades.

Remarque

La prise en charge du mot clé C++ standard asm par Visual C++ se limite au fait que le compilateur ne génère pas d'erreur pour le mot clé. Toutefois, un bloc asm ne génère aucun code explicite. Utilisez __asm au lieu de asm.

Grammaire

asm-block :
__asmassembly-instruction;opt
__asm {assembly-instruction-list};opt

assembly-instruction-list :
assembly-instruction;opt
assembly-instruction assembly-instruction-list;opt;

Notes

Utilisé sans accolades, le mot clé __asm signifie que le reste de la ligne est une instruction en langage assembleur. Utilisé avec les accolades, il signifie que chaque ligne entre accolades est une instruction en langage assembleur. Pour assurer la compatibilité avec les versions antérieures, _asm est un synonyme de __asm.

Dans la mesure où le mot clé __asm est un séparateur d'instruction, vous pouvez placer des instructions assembleur sur la même ligne :

Avant Visual Studio 2005, l’instruction

__asm int 3

n’a pas généré de code natif lors de la compilation avec /clr ; le compilateur a traduit l’instruction en instruction d’arrêt CLR.

__asm int 3 entraîne maintenant la génération de code natif pour la fonction. Si vous souhaitez qu’une fonction provoque un point d’arrêt dans votre code et que vous souhaitez que cette fonction soit compilée dans MSIL, utilisez __debugbreak.

Pour la compatibilité avec les versions précédentes, _asm il s’agit d’un synonyme de __asm l’option du compilateur /Za (Désactiver les extensions de langage) spécifiée.

Exemple

Le fragment de code suivant est un simple bloc __asm entre accolades :

__asm {
   mov al, 2
   mov dx, 0xD007
   out dx, al
}

Vous pouvez aussi placer __asm devant chaque instruction assembleur :

__asm mov al, 2
__asm mov dx, 0xD007
__asm out dx, al

Le mot clé __asm étant un séparateur d'instruction, vous pouvez également insérer des instructions assembleur sur la même ligne :

__asm mov al, 2   __asm mov dx, 0xD007   __asm out dx, al

Les trois exemples génèrent le même code, mais le premier style (bloc __asm placé entre accolades) présente quelques avantages. Les accolades séparent clairement le code de l'assembly du code C ou C++. De plus, elles évitent toute répétition inutile du mot clé __asm. Les accolades peuvent également empêcher les ambiguïtés. Pour placer une instruction C ou C++ sur la même ligne qu'un bloc __asm, placez le bloc entre accolades. Sans accolades, le compilateur ne peut pas indiquer où le code d’assembly s’arrête et les instructions C ou C++ commencent. Enfin, étant donné que le texte entre accolades a le même format que le texte MASM ordinaire, vous pouvez facilement couper et coller le texte depuis des fichiers sources MASM existants.

Contrairement aux accolades en C et C++, celles encadrant un bloc __asm n'affectent pas la portée de la variable. Vous pouvez également imbriquer __asm des blocs ; l’imbrication n’affecte pas l’étendue des variables.

FIN de la section spécifique à Microsoft

Voir aussi

Mots clés
Assembleur inline