Définir des blocs de __asm comme macros C
Spécifique à Microsoft
Les macros C offrent un moyen pratique pour insérer le code d'assembly dans votre code source, mais elles requièrent un soin supplémentaire car une macro développe en une Ligne logique unique.pour créer des macros sans problèmes, suivez ces règles :
Indiquez le bloc d' __asm accolades.
Placez le mot clé d' __asm devant chaque instruction assembly.
L'utilisation C à l'ancien les commentaires ( /* comment */) au lieu des commentaires de style de l'assembly ( ; comment) ou C sur une ligne commentaires ( // comment).
Pour afficher, l'exemple suivant définit un simple :
#define PORTIO __asm \
/* Port output */ \
{ \
__asm mov al, 2 \
__asm mov dx, 0xD007 \
__asm out dx, al \
}
À première vue, les trois derniers mots clés d' __asm semblent superflus.Ils sont nécessaires, toutefois, la macro développe sur une seule ligne :
__asm /* Port output */ { __asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al }
Le troisième et le quatrième mots clés d' __asm sont nécessaires comme séparateurs d'instruction.Les seuls séparateurs d'instruction identifiés en blocs d' __asm sont le caractère de saut de ligne et le mot clé d' __asm .Étant donné qu'un bloc défini comme macro est une Ligne logique, vous devez séparer chaque instruction avec __asm.
Les accolades est essentielle également.Si vous l'omettez, le compilateur peut être confondu par les instructions C ou C++ sur la même ligne située à droite de l'appel de macro.Sans accolade fermante, le compilateur ne peut pas indiquer où le code assembleur arrête, et il consulte les instructions C ou C++ après le bloc d' __asm comme instructions assembleur.
les commentaires de style de l'assembly qui commencent par un point-virgule (;) continuent à la fin de la ligne.Cela pose des problèmes dans les macros car le compilateur ignore tout après le commentaire, complètement à la fin de la Ligne logique.Il en va de même C sur une ligne ou C++ commentaires ( // comment).Pour éviter toute erreur, utilisez des commentaires à l'ancien C ( /* comment */) en blocs d' __asm définis comme des macros.
Un bloc d' __asm écrit en tant que c peut accepter des arguments.Contrairement à une macro ordinaire C, toutefois, une macro d' __asm ne peut pas retourner une valeur.Vous ne pouvez pas utiliser ces macros dans des expressions C ou C++.
Veillez à ne pas appeler des macros de ce type de manière aléatoire.Par exemple, appeler une macro en langage assembleur dans une fonction déclarée avec la convention d' __fastcall peut provoquer des résultats inattendus.(Consultez À l'aide de et conservant les registres dans l'assembly inline.)
détail de FIN Microsoft