Zápis funkcí s vloženým sestavením
Specifické pro Microsoft
Pokud napíšete funkci v kódu sestavení vložené, je snadné předat argumenty funkce a vrátit hodnotu.Následující příklady porovnat funkce nejprve zapsána pro samostatné assembler a potom zapsány pro inline assembler.Volaná funkce power2, přijímá dva parametry, první parametr vynásobí 2 napájení druhého parametru.Je určen pro samostatné assembler, funkce může vypadat například takto:
; POWER.ASM
; Compute the power of an integer
;
PUBLIC _power2
_TEXT SEGMENT WORD PUBLIC 'CODE'
_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+4] ; Get first argument
mov ecx, [ebp+6] ; Get second argument
shl eax, cl ; EAX = EAX * ( 2 ^ CL )
pop ebp ; Restore EBP
ret ; Return with sum in EAX
_power2 ENDP
_TEXT ENDS
END
Vzhledem k tomu, že je napsán pro samostatné assembler, vyžaduje funkci samostatného zdrojového souboru a sestavení a odkaz kroky.Argumenty funkce jazyka C a C++ jsou obvykle předávány do zásobníku, tak tato verze power2 funkce přistupuje k argumenty podle jejich pozice v zásobníku. (Všimněte si, že MODEL směrnice v MASM a některé montéři rovněž umožňuje přístup k zásobníku argumenty a proměnné místního zásobníku podle názvu.)
Příklad
Tento program zapisuje power2 funkci v kódu sestavení vložené:
// 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 argumenty podle názvu a zobrazí se ve stejném zdrojovém souboru jako zbytek programu.Tato verze vyžaduje také montáž méně.
Protože vložený verzi power2 neprovede a C return prohlášení, způsobuje, že neškodné upozornění Pokud kompilujete na upozornění úrovně 2 nebo vyšší.Funkce vrací hodnotu, ale kompilátor nemůže určit, v případě neexistence return prohlášení.Můžete použít #pragma warning Chcete-li zakázat generování upozornění.
Specificka produktu Microsoft END