__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. Ele não pode aparecer sozinho. Ele deve ser seguido por uma instrução de assembly, um grupo de instruções entre chaves ou, no mínimo, um par vazio de chaves. 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 fazia com que o código nativo fosse gerado quando compilado com /clr; o compilador converteu a instrução para uma instrução de interrupção 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 reconhecer o ponto em que o código do assembly para e em que 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 __asm
; o aninhamento não afeta o escopo da variável.
Fim da seção específica da Microsoft