Dela via


Skriva funktioner med inline assembler

Microsoft-specifik

Anmärkning

Inbyggd assemblerkod är endast tillgänglig för x86-målplattformar. För liknande funktioner i x64- eller ARM64-kod använder du inbyggda kompilatorer.

Om du skriver en funktion med infogad sammansättningskod är det enkelt att skicka argument till funktionen och returnera ett värde från den. I följande exempel jämförs en funktion som först har skrivits för en separat assembler och sedan skrivs om för en inline-assembler. Funktionen, som kallas power2, tar emot två parametrar och multiplicerar den första parametern med 2 med kraften i den andra parametern. Som en separat assemblerfil kan funktionen se ut så här:

; 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

Eftersom den är skriven som en separat assemblerfil kräver funktionen separata sammansättnings- och länksteg. C- och C++-funktionsargument skickas vanligtvis på stacken, så den här versionen av funktionen kommer åt argumenten power2 genom deras positioner i stacken. (Direktivet MODEL , som finns i MASM och några andra assemblers, ger dig också åtkomst till stackargument och lokala stackvariabler efter namn.)

Exempel

Det här programmet skriver power2-funktionen med inbäddad assemblerkod.

// 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
}

Den infogade versionen av power2 funktionen refererar till dess argument efter namn och visas i samma källfil som resten av programmet. Den här versionen kräver också färre sammansättningsinstruktioner.

Eftersom den infogade versionen av power2 inte kör en C-instruktion return orsakar den en ofarlig varning om du kompilerar på varningsnivå 2 eller högre. Funktionen returnerar ett värde, men kompilatorn kan inte se att den gör det i avsaknad av en return -instruktion. Du kan använda #pragma warning för att inaktivera genereringen av den här varningen.

Avsluta Microsoft Specifik

Se även

Använda C eller C++ i __asm Block