Compartir a través de


La escritura ejecuta el ensamblado en línea

Específicos de Microsoft

Si escribe una función con código de ensamblado en línea, es fácil pasar argumentos a la función y devolver un valor de.Los ejemplos siguientes se compara una función primero escrita para un ensamblador independiente y después reescrita para el ensamblador en línea.La función, denominada power2, recibe dos parámetros, multiplicando el primer parámetro por 2 a la potencia del segundo parámetro.Escriba para el ensamblador independiente, la función podría ser así:

; 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

Puesto que ha escrito para un ensamblador independiente, la función requiere pasos de un archivo de código fuente independiente y ensamblado y de vínculo.Los argumentos de la función de c y C++ se pasan normalmente en la pila, por lo que esta versión de acceso de la función de power2 sus argumentos por sus posiciones en la pila.(Observe que la directiva de Modelo , las disponibles en MASM y otros ensambladores, también permite obtener acceso a los argumentos de la pila y a variables locales de la pila por nombre.)

Ejemplo

Este programa escribe la función de power2 con código de ensamblado en línea:

// 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 en línea de la función de 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 en línea de power2 no ejecuta la instrucción de C++. return , provoca una advertencia inofensiva si compila en el nivel de advertencia 2 o más alto.La función devuelve un valor, pero el compilador no puede indicar que en ausencia de una instrucción de return .Puede utilizar #pragma warning deshabilitar la generación de esta advertencia.

Específico de Microsoft de FINAL

Vea también

Referencia

Mediante C o C++ en bloques de __asm