Definindo blocos __asm como macros do C
Seção específica da Microsoft
As macros do C oferecem uma maneira conveniente de inserir código de assembly no código-fonte, mas exigem cuidado extra porque uma macro se expande para uma única linha lógica. Para criar macros sem problemas, siga estas regras:
Coloque o bloco
__asm
entre chaves.Coloque a palavra-chave
__asm
na frente de cada instrução de assembly.Use comentários C de estilo antigo (
/* comment */
) em vez de comentários no estilo assembly (; comment
) ou comentários C de linha única (// comment
).
Para ilustrar, o exemplo a seguir define uma macro simples:
#define PORTIO __asm \
/* Port output */ \
{ \
__asm mov al, 2 \
__asm mov dx, 0xD007 \
__asm out dx, al \
}
À primeira vista, as últimas três palavras-chave __asm
parecem supérfluas. Elas são necessárias, no entanto, porque a macro se expande para uma única linha:
__asm /* Port output */ { __asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al }
A terceira e a quarta palavras-chave __asm
são necessárias como separadores de instrução. Os únicos separadores de instrução reconhecidos em blocos __asm
são o caractere de nova linha e a palavra-chave __asm
. Como um bloco definido como uma macro é uma linha lógica, você deve separar cada instrução com __asm
.
As chaves também são essenciais. Se você omiti-las, o compilador poderá ser confundido por instruções C ou C++ na mesma linha à direita da invocação de macro. Sem a chave de fechamento, o compilador não pode informar onde o código do assembly termina e vê instruções C ou C++ após o bloco __asm
como instruções de assembly.
Os comentários no estilo assembly que começam com um ponto e vírgula (;) continuam até o final da linha. Isso causa problemas em macros porque o compilador ignora tudo após o comentário, até o final da linha lógica. O mesmo acontece com comentários de linha única C ou C++ (// comment
). Para evitar erros, use comentários C de estilo antigo (/* comment */
) em blocos __asm
definidos como macros.
Um bloco __asm
escrito como uma macro C pode aceitar argumentos. Ao contrário de uma macro C comum, no entanto, uma macro __asm
não pode retornar um valor. Portanto, você não pode usar essas macros em expressões C ou C++.
Tenha cuidado para não invocar macros desse tipo indiscriminadamente. Por exemplo, invocar uma macro de linguagem de assembly em uma função declarada com a convenção __fastcall
pode causar resultados inesperados. (Confira Usar e preservar registros no assembly embutido.)
Fim da seção específica da Microsoft