Delen via


Functies schrijven met inline-assembly.

Microsoft-specifieke

Opmerking

Inline-assembly is alleen beschikbaar voor x86-doelen. Gebruik compilerintrinsiek voor vergelijkbare functionaliteit in x64- of ARM64-code.

Als u een functie schrijft met inline assemblycode, is het eenvoudig om argumenten door te geven aan de functie en er een waarde uit te retourneren. In de volgende voorbeelden wordt een functie vergeleken die voor een afzonderlijke assembly is geschreven en vervolgens opnieuw wordt geschreven voor de inlineassembly. De functie, aangeroepen power2, ontvangt twee parameters, waarbij de eerste parameter met 2 wordt vermenigvuldigd met de macht van de tweede parameter. Als afzonderlijk assemblybestand kan de functie er als volgt uitzien:

; 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

Omdat deze is geschreven als een afzonderlijk assemblybestand, vereist de functie afzonderlijke assembly- en koppelingsstappen. C- en C++-functieargumenten worden meestal doorgegeven aan de stack, zodat deze versie van de power2 functie toegang krijgt tot de argumenten door hun posities op de stack. (Met de MODEL instructie, beschikbaar in MASM en andere assembly's, hebt u ook toegang tot stackargumenten en lokale stackvariabelen op naam.)

Voorbeeld

Met dit programma wordt de power2 functie geschreven met inline assemblycode:

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

De inlineversie van de power2 functie verwijst naar de argumenten op naam en wordt weergegeven in hetzelfde bronbestand als de rest van het programma. Deze versie vereist ook minder assembly-instructies.

Omdat de inlineversie van power2 geen C-instructie return uitvoert, veroorzaakt dit een ongevaarlijke waarschuwing als u compileert op waarschuwingsniveau 2 of hoger. De functie retourneert een waarde, maar de compiler kan niet vaststellen dat dit het geval is door de afwezigheid van een return instructie. U kunt #pragma warning gebruiken om de generatie van deze waarschuwing uit te schakelen.

Microsoft-specifieke beƫindigen

Zie ook

C of C++ gebruiken in __asm blokken