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