Partager via


__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. Il ne peut pas apparaître de lui-même. Il doit être suivi par une instruction assembleur, un groupe d'instructions entre accolades ou, au minimum, par une paire d'accolades vide. 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 :
__asm assembly-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

ne permettait pas de générer de code natif une fois compilée avec /clr ; le compilateur traduisait l'instruction en une instruction de saut CLR.

__asm int 3 entraîne maintenant la génération de code natif pour la fonction. Pour qu'une fonction génère un point d'arrêt dans votre code et qu'elle soit compilée en langage MSIL, utilisez __debugbreak.

Pour la compatibilité avec les versions précédentes, _asm est un synonyme de __asm, sauf si l’option du compilateur /Za (Désactiver les extensions de langage) est 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 savoir où le code assembleur s'arrête et où les instructions C ou C++ démarrent. 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 les blocs __asm ; l'imbrication n'affecte pas la portée de la variable.

FIN de la section spécifique à Microsoft

Voir aussi

Mots clés
Assembleur inline