Функции записи со встроенной сборкой

Только для систем 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 отключить создание этого предупреждения.

ЭЛЕМЕНТ, относящийся Майкрософт

См. также

Ссылки

Использование c или C++ в блоках __asm