Freigeben über


Schreiben von Funktionen mit der Inlineassembly

Microsoft-spezifisch

Wenn Sie eine Funktion Inlineassemblycode mit schreiben, ist es einfach, Argumente der Funktion zu übergeben und ein Wert davon zurückzugeben. Die folgenden Beispiele vergleichen eine Funktion, die anfänglich für einen separaten Assembler geschrieben und dann für den Inlineassembler umgeschrieben ist. Die Funktion, power2, empfängt zwei Parameter und multipliziert den ersten Parameter als 2 zur Leistungsfähigkeit des zweiten Parameters. Geschrieben für einen separaten Assembler, könnte die Funktion wie folgt aus:

; 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

Da sie für einen separaten Assembler geschrieben wurde, benötigt die Funktion Schritte einer separaten Quelldatei und der Assembly und des Links. C- und C++-Funktionsargumente werden normalerweise auf den Stapel, sodass diese Version der power2-Funktionszugriffe ihre Argumente anhand ihrer Positionen auf dem Stapel übergeben. (Hinweis, der auch die MODELL-Direktive, den verfügbaren in MASM und in einigen anderen Assemblern, können Sie mithilfe der Zugriffsstapelargumenten und den lokalen Stapelvariablen Namen. zugesteht)

Beispiel

Das Programm schreibt die Funktion mit power2 verwiesen:

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

Die Stilregeln Version der Funktion power2 auf seine Argumente nach Namen an und wird in der gleichen Quelldatei wie der Rest des Programms. Diese Version erfordert auch weniger Assemblyanweisungen.

Da die inline Version von power2 nicht Anweisung eine return ausgeführt wird, verursacht sie eine harmlose Warnung, wenn Sie auf die Warnstufe 2 oder höher kompilieren. Die Funktion gibt einen Wert zurück, der Compiler kann den nicht in Ermangelung einer Anweisung return unterscheiden. Sie können #Pragmawarnung verwenden, um die Generierung diese Warnung zu deaktivieren.

END Microsoft-spezifisch

Siehe auch

Referenz

Verwenden von C oder C++ in __asm-Blöcken