__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