__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

Confira também

Palavras-chave
Assembler embutido