Scrittura di funzioni con assembly inline

Sezione specifica Microsoft

Nota

L'assembly inline è disponibile solo per le destinazioni x86. Per funzionalità simili nel codice x64 o ARM64, usare gli intrinseci del compilatore.

Se si scrive una funzione con il codice assembly inline, è facile passare argomenti alla funzione e riceverne un valore. Negli esempi seguenti viene confrontata una funzione dapprima scritta per un assembler separato e successivamente riscritta dell'assembler inline. La funzione, denominata power2, riceve due parametri, moltiplicando il primo parametro per 2 alla potenza del secondo parametro. Come file assembler separato, la funzione potrebbe essere simile alla seguente:

; 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

Poiché viene scritto come file assembler separato, la funzione richiede passaggi separati per assembly e collegamento. Gli argomenti della funzione C e C++ vengono in genere passati nello stack, pertanto l'accesso di questa versione della funzione power2 ai relativi argomenti avviene mediante le relative posizioni nello stack. La MODEL direttiva, disponibile in MASM e in altri assembler, consente anche di accedere agli argomenti dello stack e alle variabili dello stack locale in base al nome.

Esempio

In questo programma la funzione power2 viene scritta con il codice assembly inline:

// 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
}

La versione inline della funzione power2 fa riferimento ai relativi argomenti in base al nome e viene visualizzata nello stesso file di origine del resto del programma. Inoltre, in questa versione sono richieste meno istruzioni di assembly.

Poiché la versione inline di power2 non esegue un'istruzione return del linguaggio C, genera un avviso informativo se si compila con avviso di livello 2 o successivo. La funzione restituisce un valore, ma il compilatore non può indicare che funziona in assenza di un'istruzione return . È possibile usare #pragma warning per disabilitare la generazione di questo avviso.

Fine sezione specifica Microsoft

Vedi anche

Uso di C o C++ in __asm blocchi