Compartilhar via


Escrever funções com assembly embutido

Seção específica da Microsoft

Observação

O assembly embutido só está disponível para destinos x86. Para uma funcionalidade semelhante no código x64 ou ARM64, use intrínsecos do compilador.

Se você escrever uma função com código de assembly embutido, será fácil passar argumentos para a função e retornar um valor dela. Os exemplos a seguir comparam uma função gravada primeiro para um assembler separado e, em seguida, reescritas para o assembler embutido. A função, chamada power2, recebe dois parâmetros, multiplicando o primeiro parâmetro por 2 para a potência do segundo parâmetro. Como um arquivo de assembler separado, a função pode ter esta aparência:

; power2.asm 
; x86 code for C interop
; Command line: ml /c /Cx /W3 /WX power2.asm 
        .686P
        .XMM
        .MODEL  flat

PUBLIC  _power2
; int power2(int num, int power);
; computes num x 2^power
_TEXT   SEGMENT
_power2 PROC
        push    ebp             ; save EBP
        mov     ebp, esp        ; Move ESP into EBP so we can refer
                                ;   to arguments on the stack
        mov     eax, [ebp+8]    ; load first argument
        mov     ecx, [ebp+12]   ; load second argument
        shl     eax, cl         ; compute result in EAX
        pop     ebp             ; restore EBP
        ret
_power2 ENDP
_TEXT   ENDS
END

Como ela é gravada como um arquivo de assembler separado, a função requer etapas separadas de assembly e link. Os argumentos de função C e C++ geralmente são passados na pilha, portanto, essa versão da função power2 acessa seus argumentos por suas posições na pilha. (A diretiva MODEL, disponível no MASM e em alguns outros assemblers, também permite acessar argumentos de pilha e variáveis de pilha locais por nome.)

Exemplo

Este programa grava a função power2 com código de assembly embutido:

// Power2_inline_asm.c
// compile with: /EHsc
// processor: x86

#include <stdio.h>

int power2( int num, int power );

int main( void )
{
    printf_s( "3 times 2 to the power of 5 is %d\n", \
              power2( 3, 5) );
}
int power2( int num, int power )
{
   __asm
   {
      mov eax, num    ; Get first argument
      mov ecx, power  ; Get second argument
      shl eax, cl     ; EAX = EAX * ( 2 to the power of CL )
   }
   // Return with result in EAX
}

A versão embutida da função power2 refere-se a seus argumentos pelo nome e aparece no mesmo arquivo de origem que o restante do programa. Essa versão também requer menos instruções de assembly.

Como a versão embutida de power2 não executa uma instrução return C, ela fornecerá um aviso se você compilar no nível de aviso 2 ou superior. A função retorna um valor, mas o compilador não pode informá-la na ausência de uma instrução return. Você pode usar #pragma warning para desabilitar a geração deste aviso.

Fim da seção específica da Microsoft

Confira também

Usar C ou C++ em blocos __asm