Compartir a través de


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

Consulte también

Uso de C o C++ en bloques __asm