Escritura de funciones con ensamblado insertado
Específicos de Microsoft
Nota:
El ensamblado insertado solo está disponible para destinos x86. Para una funcionalidad similar en código x64 o ARM64, use Intrínsecos del controlador.
Si escribe una función con código de ensamblado alineado, es fácil pasar argumentos a la función y devolver un valor de ella. En los ejemplos siguientes se compara una función escrita primero para un ensamblador independiente y después reescrita para el ensamblador alineado. La función, denominada power2
, recibe dos parámetros y multiplica el primer parámetro por 2 elevado a la potencia del segundo parámetro. Como archivo ensamblador independiente, la función podría ser así:
; 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
Puesto que se escribió como un archivo ensamblador independiente, la función requiere pasos de ensamblado y vinculación independientes. Los argumentos de función de C y C++ se pasan normalmente en la pila, por lo que esta versión de la función power2
obtiene acceso a sus argumentos por sus posiciones en la pila. (La directiva MODEL
, disponible en MASM y otros ensambladores, también permite obtener acceso a argumentos de la pila y a variables locales de la pila por nombre).
Ejemplo
Este programa escribe la función power2
con código de ensamblado alineado:
// 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
}
La versión alineada de la función power2
hace referencia a sus argumentos por nombre y aparece en el mismo archivo de código fuente que el resto del programa. Esta versión también requiere menos instrucciones de ensamblado.
Dado que la versión alineada de power2
no ejecuta la instrucción de C++ return
, provoca una advertencia inofensiva si se compila en el nivel de advertencia 2 o más alto. La función devuelve un valor, pero el compilador no lo percibe en ausencia de una instrucción return
. Puede usar #pragma warning
para deshabilitar la generación de esta advertencia.
FIN de Específicos de Microsoft