Udostępnij za pośrednictwem


Pisanie funkcji w asemblerze wbudowanym

Specyficzne dla firmy Microsoft

Uwaga

Wbudowany zestaw jest dostępny tylko dla elementów docelowych x86. Aby uzyskać podobne funkcje w kodzie x64 lub ARM64, użyj funkcji wewnętrznych kompilatora.

Jeśli napiszesz funkcję z wbudowanym kodem zestawu, łatwo jest przekazać argumenty do funkcji i zwrócić z niej wartość. Poniższe przykłady porównują funkcję najpierw napisaną dla oddzielnego asemblera, a następnie przepisaną ponownie dla asemblera wbudowanego. Funkcja o nazwie power2otrzymuje dwa parametry, mnożąc pierwszy parametr przez 2 do potęgi drugiego parametru. Jako oddzielny plik asemblera funkcja może wyglądać następująco:

; 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

Ponieważ jest on zapisywany jako oddzielny plik asemblera, funkcja wymaga oddzielnych kroków zestawów i linków. Argumenty funkcji C i C++ są zwykle przekazywane na stosie, więc ta wersja power2 funkcji uzyskuje dostęp do argumentów według ich pozycji na stosie. (Dyrektywa MODEL dostępna w programie MASM i niektórych innych asemblerach umożliwia również dostęp do argumentów stosu i zmiennych stosu lokalnego według nazwy).

Przykład

Ten program zapisuje power2 funkcję z wbudowanym kodem zestawu:

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

Wbudowana wersja power2 funkcji odwołuje się do argumentów według nazwy i pojawia się w tym samym pliku źródłowym co pozostała część programu. Ta wersja wymaga również mniejszej liczby instrukcji dotyczących zestawów.

Ponieważ śródliniowa wersja instrukcji power2 języka C return nie jest wykonywana, powoduje nieszkodliwe ostrzeżenie w przypadku kompilacji na poziomie ostrzeżenia 2 lub wyższym. Funkcja zwraca wartość, ale kompilator nie może powiedzieć, że nie występuje w przypadku braku return instrukcji. Możesz użyć #pragma warning polecenia , aby wyłączyć generowanie tego ostrzeżenia.

END Microsoft Specific

Zobacz też

Używanie języka C lub C++ w __asm blokach