Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 power2
otrzymuje 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.
Koniec specyfiki Microsoftu