Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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
__asmem chaves.Coloque a
__asmpalavra-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