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