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