Funzioni di scrittura con assembly inline
Specifici di Microsoft
Se si scrive una funzione con il codice assembly inline, è facile passare argomenti alla funzione e da restituire un valore.Negli esempi seguenti viene confrontato una funzione dapprima scritta per un assembly separato e successivamente riscritta per l'assembler inline.La funzione, denominata power2, riceve due parametri, moltiplicanti il primo parametro per 2 alla potenza del secondo parametro.Scritto per un assembly separato, la funzione potrebbe essere simile alla seguente:
; 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
Poiché ha scritto per un assembly separato, la funzione richiede un file di origine separato e i passaggi del collegamento e dell'assembly.Gli argomenti della funzione C++ e c# in genere vengono passati nello stack, pertanto in questa versione di power2 la funzione si accede ai relativi argomenti dalle relative posizioni nello stack.Si noti che TEMPLATE la direttiva, disponibile in MASM e altri assemblatori, consente anche agli argomenti di accesso dello stack e alle variabili locali dello stack per nome.)
Esempio
questo programma scrive power2 funzione 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 di inline power2 la funzione faccia riferimento ai relativi argomenti tramite nome e visualizzato nello stesso file di origine del resto del programma.Questa versione è necessario inoltre il numero minore istruzioni dell'assembly.
Poiché la versione di inline power2 non esegue a-c return istruzione, genera un avviso innocuo se si compila ai livelli di avviso 2 o versione successiva.La funzione restituisce un valore, ma il compilatore non è in grado di riconoscere che in assenza di un oggetto return istruzione.È possibile utilizzare avviso #pragma per disabilitare la generazione dell'avviso.
Microsoft FINALE specifico