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

Siehe auch

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