Sdílet prostřednictvím


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

Viz také

Referenční dokumentace

Používání jazyka C nebo C++ v blocích __asm