Schreiben von Funktionen mit der Inlineassembly
Microsoft-spezifisch
Hinweis
Inlineassembly ist nur für x86-Ziele verfügbar. Verwenden Sie für ähnliche Funktionen in x64- oder ARM64-Code systeminterne Compiler.
Wenn Sie eine Funktion mit Inlineassemblycode schreiben, ist es einfach, Argumente an die Funktion zu übergeben und einen Wert daraus zurückzugeben. In den folgenden Beispielen wird eine Funktion verglichen, die zuerst für einen separaten Assembler geschrieben und dann für den Inlineassembler neu geschrieben wurde. Die Funktion, die aufgerufen wird power2
, empfängt zwei Parameter und multipliziert den ersten Parameter mit 2 mit der Potenz des zweiten Parameters. Als separate Assemblerdatei kann die Funktion wie folgt aussehen:
; 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
Da sie als separate Assemblerdatei geschrieben ist, erfordert die Funktion separate Assembly- und Verknüpfungsschritte. C- und C++-Funktionsargumente werden in der Regel im Stapel übergeben, sodass diese Version der power2
Funktion auf ihre Argumente durch ihre Positionen im Stapel zugreift. (Die MODEL
Direktive, die in MASM und einigen anderen Assemblern verfügbar ist, ermöglicht ihnen auch den Zugriff auf Stapelargumente und lokale Stapelvariablen anhand des Namens.)
Beispiel
Dieses Programm schreibt die power2
Funktion mit Inlineassemblycode:
// 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 Inlineversion der power2
Funktion bezieht sich auf die Argumente anhand des Namens und wird in derselben Quelldatei wie der Rest des Programms angezeigt. Diese Version erfordert auch weniger Assemblyanweisungen.
Da die Inlineversion von C power2
keine C-Anweisung return
ausführt, wird eine harmlose Warnung verursacht, wenn Sie auf Warnungsebene 2 oder höher kompilieren. Die Funktion gibt einen Wert zurück, aber der Compiler kann nicht erkennen, dass keine return
Anweisung vorhanden ist. Sie können die Generierung dieser Warnung deaktivieren #pragma warning
.
Ende Microsoft-spezifisch