Partilhar via


Escrever funções de Assembly embutido

Específicos do Microsoft

Se você escrever uma função com código de assembly embutido, é fácil passar argumentos para a função e retornar um valor a partir dele.Os exemplos a seguir comparam uma função primeiro criado para um montador separado e então reescrito para o montador in-line.A função, chamada power2, recebe dois parâmetros, multiplicando o primeiro parâmetro por 2 à potência do segundo parâmetro.A função escrito para um montador separado, pode parecer com isso:

; POWER.ASM
; Compute the power of an integer
;
       PUBLIC _power2
_TEXT SEGMENT WORD PUBLIC 'CODE'
_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+4] ; Get first argument
        mov ecx, [ebp+6] ; Get second argument
        shl eax, cl     ; EAX = EAX * ( 2 ^ CL )
        pop ebp         ; Restore EBP
        ret             ; Return with sum in EAX

_power2 ENDP
_TEXT   ENDS
        END

Como ele foi escrito para um montador separada, a função requer um etapas de arquivo e o assembly e o link de origem separado.Argumentos da função de c e C++ são passados na pilha, portanto, esta versão do power2 função acessa seus argumentos por suas posições na pilha.(Observe que o modelo diretiva, disponível no MASM e alguns outros montadores também permite que você acesse os argumentos de pilha e variáveis de local de pilha por nome.)

Exemplo

Este programa grava o power2 função 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 in-line a power2 refere-se aos argumentos por nome de função e aparece no arquivo de origem mesmo que o resto do programa.Esta versão também requer menos instruções do assembly.

Porque a versão embutida do power2 não executa uma c return a instrução, ele faz um aviso inofensivo se você compilar no nível de aviso 2 ou superior.A função retornar um valor, mas o compilador não pode informar que na ausência de um return instrução.Você pode usar aviso # pragma para desativar a geração desse aviso.

Específicos do Microsoft final

Consulte também

Referência

Usando c ou C++ em blocos de __asm