__asm
Seção específica da Microsoft
A palavra-chave __asm
invoca o assembler embutido e pode aparecer sempre que uma declaração C é válida. Ela não pode aparecer sozinha. Deve ser seguido por uma instrução de montagem, um grupo de instruções entre aparelhos ortodônticos ou, no mínimo, um par de aparelhos vazios. O termo "bloco __asm
" refere-se aqui a qualquer instrução ou grupo de instruções, estando ou não entre chaves.
Observação
O suporte do Visual C++ para a palavra-chave Standard C++ asm
é limitado devido ao fato de que o compilador não vai gerar um erro na palavra-chave. No entanto, um bloco asm
não vai gerar nenhum código significativo. Use __asm
em vez de asm
.
Gramática
asm-block:
__asm
assembly-instruction;
opt
__asm {
assembly-instruction-list}
;
opt
assembly-instruction-list:
assembly-instruction;
opt
assembly-instruction;
assembly-instruction-list;
opt
Comentários
Se usada sem chaves, a palavra-chave __asm
significa que o restante da linha é uma instrução de linguagem assembly. Se usada com chaves, significa que cada linha entre as chaves é uma instrução de linguagem assembly. Para compatibilidade com versões anteriores, _asm
é um sinônimo de __asm
.
Como a palavra-chave __asm
é um separador de instruções, você também pode colocar instruções de assembly na mesma linha.
Antes do Visual Studio 2005, a instrução
__asm int 3
não fez com que o código nativo fosse gerado quando compilado com /clr; o compilador traduziu a instrução para uma instrução de quebra CLR.
__asm int 3
agora resulta na geração de código nativo para a função. Se você quiser que uma função cause um ponto de interrupção no código e se quiser que essa função seja compilada para MSIL, use __debugbreak.
Para compatibilidade com versões anteriores, _asm
é um sinônimo para __asm
, a menos que a opção do compilador /Za (Desabilitar extensões de linguagem) seja especificada.
Exemplo
O fragmento de código a seguir é um bloco __asm
simples entre chaves:
__asm {
mov al, 2
mov dx, 0xD007
out dx, al
}
Como alternativa, você pode colocar __asm
na frente de cada instrução de assemblies:
__asm mov al, 2
__asm mov dx, 0xD007
__asm out dx, al
Como a palavra-chave __asm
é um separador de instruções, você também pode colocar instruções de assembly na mesma linha:
__asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al
Todos os três exemplos geram o mesmo código, mas o primeiro estilo (incluindo o bloco __asm
entre chaves) tem algumas vantagens. As chaves separam claramente o código do assembly do código C ou C++ e evitam a repetição desnecessária da palavra-chave __asm
. Chaves também podem evitar ambiguidades. Se você quiser colocar uma instrução C ou C++ na mesma linha que um bloco __asm
, deverá colocar o bloco entre chaves. Sem as chaves, o compilador não pode dizer onde o código do assembly pára e as instruções C ou C++ começam. Por fim, como o texto entre chaves tem o mesmo formato que o texto MASM comum, você pode facilmente cortar e colar texto de arquivos de origem MASM existentes.
Ao contrário das chaves em C e C++, as chaves que incluem um bloco __asm
não afetam o escopo da variável. Você também pode aninhar blocos, o aninhamento __asm
não afeta o escopo variável.
Fim da seção específica da Microsoft
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de