__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 :
__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
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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour