Compartilhar via


__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:
__asmassembly-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

Palavras-chave
Assembler embutido