Функции записи со встроенной сборкой
Только для систем Microsoft
При написании функция со встроенными кодом сборки, легко передавать аргументы функции и вернуть значение из него.В следующих примерах функция сравнения сначала для ассемблера записанная по отдельности, а затем перезаписанная для встроенного ассемблера.Вызываемая функция power2получает 2 параметров первый параметр 2 в степени второго параметра.Записи для отдельных ассемблера, функциональность функции может выглядеть следующим образом:
; 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
Поскольку она записывала для отдельных ассемблера функция требует шагов отдельного файла источника и сборки и связи.Аргументы функции c и C++ обычно передаются в стек, поэтому эту версию power2 функция производит доступ к его аргументы их позициями в стеке.(Следует отметить, Модель директива, доступное в MASM и некоторые другие ассемблеры, также позволяют к аргументам стека доступа и локальным переменным стека по имени.)
Пример
Эта программа записывает power2 функция со встроенными кодом сборки:
// 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
}
Встроенная версия power2 функция относится к своим аргументам именем и появляется в тот же файл источника, как выполнение программы.Эту версию также требуется меньшее количество инструкций по монтажу.
Так как встроенная версия power2 не выполняет C. return выписка, он вызывает невредное предупреждение при компилировании на пороге предупреждений или высоком 2.Функция возвращает значение, но компилятор не может определить то в случае отсутствия a return выписка.Можно использовать предупреждение #pragma отключить создание этого предупреждения.
ЭЛЕМЕНТ, относящийся Майкрософт