Partilhar via


Funções de escrita com montagem em linha

Específico da Microsoft

Observação

A montagem em linha só está disponível para destinos x86. Para 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, é fácil passar argumentos para a função e retornar um valor dela. Os exemplos a seguir comparam uma função escrita primeiro para um montador separado e depois reescrita para o montador em linha. 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 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

Uma vez que é escrito como um arquivo assembler separado, a função requer etapas separadas de montagem e link. Os argumentos das funções C e C++ costumam ser passados na pilha, portanto, esta versão da função power2 acede aos seus argumentos pelas suas posições na pilha. (A diretiva MODEL, disponível no MASM e noutros montadores de assemblagem, também permite o acesso a argumentos de pilha e variáveis locais da pilha por nome.)

Exemplo

Este programa grava a power2 função com código de montagem em linha:

// 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 inline da função power2 refere-se aos seus argumentos pelo nome e aparece no mesmo ficheiro de origem que o resto do programa. Esta versão também requer menos instruções de montagem.

Como a versão embutida do power2 não executa uma instrução C return , ela causa um aviso inofensivo se você compilar no nível de aviso 2 ou superior. A função retorna um valor, mas o compilador não pode dizer que o faz na ausência de uma return instrução. Você pode usar #pragma warning para desativar a geração deste aviso.

END Específico da Microsoft

Ver também

Usando C ou C++ em __asm blocos