Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Microsoft-specifieke
Opmerking
Inline-assembly is alleen beschikbaar voor x86-doelen. Gebruik compilerintrinsiek voor vergelijkbare functionaliteit in x64- of ARM64-code.
Als u een functie schrijft met inline assemblycode, is het eenvoudig om argumenten door te geven aan de functie en er een waarde uit te retourneren. In de volgende voorbeelden wordt een functie vergeleken die voor een afzonderlijke assembly is geschreven en vervolgens opnieuw wordt geschreven voor de inlineassembly. De functie, aangeroepen power2, ontvangt twee parameters, waarbij de eerste parameter met 2 wordt vermenigvuldigd met de macht van de tweede parameter. Als afzonderlijk assemblybestand kan de functie er als volgt uitzien:
; 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
Omdat deze is geschreven als een afzonderlijk assemblybestand, vereist de functie afzonderlijke assembly- en koppelingsstappen. C- en C++-functieargumenten worden meestal doorgegeven aan de stack, zodat deze versie van de power2 functie toegang krijgt tot de argumenten door hun posities op de stack. (Met de MODEL instructie, beschikbaar in MASM en andere assembly's, hebt u ook toegang tot stackargumenten en lokale stackvariabelen op naam.)
Voorbeeld
Met dit programma wordt de power2 functie geschreven met inline assemblycode:
// 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
}
De inlineversie van de power2 functie verwijst naar de argumenten op naam en wordt weergegeven in hetzelfde bronbestand als de rest van het programma. Deze versie vereist ook minder assembly-instructies.
Omdat de inlineversie van power2 geen C-instructie return uitvoert, veroorzaakt dit een ongevaarlijke waarschuwing als u compileert op waarschuwingsniveau 2 of hoger. De functie retourneert een waarde, maar de compiler kan niet vaststellen dat dit het geval is door de afwezigheid van een return instructie. U kunt #pragma warning gebruiken om de generatie van deze waarschuwing uit te schakelen.
Microsoft-specifieke beƫindigen