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