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