Partilhar via


Definindo blocos de __asm como macros C

Específico da Microsoft

As macros C oferecem uma maneira conveniente de inserir o código assembly em seu código-fonte, mas exigem cuidado extra porque uma macro se expande em uma única linha lógica. Para criar macros sem problemas, siga estas regras:

  • Envolva o bloco __asm em chaves.

  • Coloque a __asm palavra-chave na frente de cada instrução de montagem.

  • Use comentários C antigos (/* comment */) em vez de comentários em 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 três __asm últimas palavras-chave parecem supérfluas. Eles são necessários, no entanto, porque o macro se expande em uma única linha:

__asm /* Port output */ { __asm mov al, 2  __asm mov dx, 0xD007 __asm out dx, al }

A terceira e quarta __asm palavras-chave são necessárias para separar instruções. Os únicos separadores de instrução reconhecidos em blocos __asm são a palavra-chave __asm e o caractere de nova linha. Como um bloco definido como uma macro é uma linha lógica, você deve separar cada instrução com __asm.

Os aparelhos dentários também são essenciais. Se você omiti-los, o compilador pode ser confundido por instruções C ou C++ na mesma linha à direita da invocação de macro. Sem a chave de fecho, o compilador não consegue determinar onde termina o código assembly, e interpreta instruções C ou C++ após o bloco __asm como código assembly.

Os comentários no estilo assembly que começam com 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 em C ou C++ (// comment). Para evitar erros, use comentários em C de estilo antigo (/* comment */) em blocos __asm definidos como macros.

Um __asm bloco escrito como uma macro C pode aceitar argumentos. Ao contrário de uma macro C comum, no entanto, uma __asm macro 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 deste tipo indiscriminadamente. Por exemplo, invocar uma macro de linguagem assembly em uma função declarada com a __fastcall convenção pode causar resultados inesperados. (Consulte Usando e preservando registros na montagem em linha.)

END Específico da Microsoft

Ver também

Montador em linha