Sdílet prostřednictvím


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

Viz také

Použití jazyka C nebo C++ v __asm blocích