Partilhar via


Definição de blocos de __asm como Macros C

Específicos do Microsoft

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

  • Coloque o __asm bloquear chaves.

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

  • Usar os comentários c de estilo antigo ( /* comment */) em vez de comentários do estilo do assembly ( ; comment) ou comentários de linha única C ( // 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, os três últimos __asm as palavras-chave parecem supérfluas.Eles são necessários, no entanto, porque a macro expande-se em uma única linha:

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

A terceira e quarta __asm as palavras-chave são necessários como separadores de instrução.Os separadores de instrução única reconhecido no __asm blocos são o caractere de nova linha e __asm palavra-chave.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-los, o compilador pode ficar confusos com instruções de c ou C++ na mesma linha à direita da invocação macro.Sem a chave de fechamento, o compilador não pode determinar onde o código assembly pára e ele vê instruções c ou C++ a __asm bloco como instruções assembly.

Estilo de assembly comentários que começam com um ponto e vírgula (;) continuar até o final da linha.Isso causa problemas nas macros porque o compilador ignora tudo após o comentário, até o final da linha lógica.O mesmo é verdadeiro de comentários de linha única c ou C++ ( // comment).Para evitar erros, usar os comentários c de estilo antigo ( /* comment */) em __asm blocos definido como macros.

Um __asm Bloco gravado como uma macro c pode levar argumentos.Ao contrário de uma comum c macro, no entanto, um __asm macro não pode retornar um valor.É possível usar essas macros em expressões c ou C++.

Tenha cuidado para não chamar macros desse tipo indiscriminadamente.Por exemplo, chamar uma macro de linguagem assembly em uma função declarada com o __fastcall convenção pode causar resultados inesperados.(Consulte usando e preservação de registros de Assembly embutido.)

Específicos do Microsoft final

Consulte também

Referência

Montador embutido