Zápis funkcí s vloženým sestavením
Specifické pro Microsoft
Poznámka:
Vložené sestavení je k dispozici pouze pro cíle x86. Pro podobné funkce v kódu x64 nebo ARM64 použijte vnitřní prvky kompilátoru.
Pokud napíšete funkci s vloženým kódem sestavení, je snadné předat funkci argumenty a vrátit z ní hodnotu. Následující příklady porovnávají funkci, která byla nejprve napsaná pro samostatný assembler, a pak se přepsala pro vložený assembler. Funkce, volaná power2
, přijímá dva parametry, vynásobí první parametr číslem 2 na mocninu druhého parametru. Jako samostatný soubor assembleru může funkce vypadat takto:
; 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
Vzhledem k tomu, že je napsaný jako samostatný soubor assembleru, funkce vyžaduje samostatné kroky sestavení a propojení. Argumenty funkce C a C++ se obvykle předávají v zásobníku, takže tato verze power2
funkce přistupuje k argumentům podle jejich pozic v zásobníku. (Direktiva MODEL
, která je k dispozici v MASM a některých dalších assemblerech, umožňuje také přístup k argumentům zásobníku a lokálním proměnným zásobníku podle názvu.)
Příklad
Tento program zapíše power2
funkci s vloženým kódem sestavení:
// 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
}
Vložená verze power2
funkce odkazuje na jeho argumenty podle názvu a zobrazí se ve stejném zdrojovém souboru jako zbytek programu. Tato verze také vyžaduje méně instrukcí sestavení.
Protože vložená verze power2
nespustí příkaz jazyka C return
, způsobí neškodné upozornění, pokud zkompilujete na úrovni upozornění 2 nebo vyšší. Funkce vrátí hodnotu, ale kompilátor nemůže zjistit, že neobsahuje return
příkaz. Můžete použít #pragma warning
k zakázání generování tohoto upozornění.
END Microsoft Specific