Visão geral do assembler embutido

Seção específica da Microsoft

O assembler embutido permite embutir instruções da linguagem de assembly diretamente aos seus programas fonte C e C++ sem etapas adicionais de assembly e vinculação. O assembler integrado é incorporado ao compilador e, portanto, não é necessário um assembler separado, como o MASM (Microsoft Macro Assembler).

Como o assembler integrado não requer etapas de link e do assembly separado, é mais conveniente que um assembler separado. O código do assembly embutido pode usar qualquer nome de variável ou de função C ou C++ que esteja no escopo. Portanto, ele é de fácil integração com código C e C++ do programa. E, como o código do assembly pode ser combinado com as instruções de C e C++, ele pode realizar as tarefas que são incômodas ou impossíveis apenas em C ou C++.

A palavra-chave __asm invoca o assembler embutido e pode aparecer sempre que uma declaração C ou C++ é válida. Ela não pode aparecer sozinha. Ela deve ser seguida por uma instrução de assembly, um grupo de instruções entre chaves ou, pelo menos, 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.

O código a seguir é um bloco __asm simples entre chaves. (O código é uma sequência personalizada de prólogos da função.)

// asm_overview.cpp
// processor: x86
void __declspec(naked) main()
{
    // Naked functions must provide their own prolog...
    __asm {
        push ebp
        mov ebp, esp
        sub esp, __LOCAL_SIZE
    }

    // ... and epilog
    __asm {
        pop ebp
        ret
    }
}

Como alternativa, você pode colocar __asm na frente de cada instrução de assemblies:

__asm push ebp
__asm mov  ebp, esp
__asm sub  esp, __LOCAL_SIZE

Como a palavra-chave __asm é um separador de instruções, você também pode colocar instruções de assembly na mesma linha:

__asm push ebp   __asm mov  ebp, esp   __asm sub  esp, __LOCAL_SIZE

Fim da seção específica da Microsoft

Confira também

Assembler embutido