Compartilhar via


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

Confira também

Assembler embutido