Megosztás:


Függvények írása beágyazott assembly kóddal

Microsoft-specifikus

Megjegyzés:

A beágyazott assembly kód csak x86-architektúrákhoz érhető el. Az x64- vagy ARM64-kód hasonló funkcióihoz használja a fordító belső funkcióit.

Ha beágyazott szerelvénykóddal ír egy függvényt, könnyen átadhat argumentumokat a függvénynek, és visszaadhat belőle egy értéket. Az alábbi példák egy függvény külön assemblerhez írt változatát hasonlítják össze, amelyet aztán újraírtak beágyazott assemblert használva. A hívott power2függvény két paramétert kap, az első paramétert 2-gyel megszorozva a második paraméter hatványával. Különálló összeállítófájlként a függvény a következőképpen nézhet ki:

; 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

Mivel külön összeszerelőfájlként van megírva, a függvény külön szerelvény- és csatolási lépéseket igényel. A C és a C++ függvény argumentumai általában a veremen vannak átadva, így a függvény ezen verziója a power2 veremen lévő pozícióik alapján éri el az argumentumait. (A MODEL MASM-ben és néhány más összeszerelőben elérhető irányelv lehetővé teszi a veremargumentumok és a helyi veremváltozók név szerinti elérését is.)

példa

Ez a program beágyazott power2 szerelvénykóddal írja a függvényt:

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

A függvény beágyazott verziója power2 név szerint hivatkozik az argumentumokra, és ugyanabban a forrásfájlban jelenik meg, mint a program többi része. Ez a verzió kevesebb összeszerelési utasítást is igényel.

Mivel a soros verzió power2 nem hajt végre C return utasítást, a fordításkor ártalmatlan figyelmeztetést okoz, ha figyelmeztetési szint 2-nél vagy magasabb szinten van. A függvény visszaad egy értéket, de a fordító nem tudja ezt megállapítani egy return utasítás hiányában. Ezzel letilthatja #pragma warning a figyelmeztetés létrehozását.

END Microsoft-specifikus kifejezés

Lásd még

Blokkokban való C vagy C++ használat __asm