Condividi tramite


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

Vedere anche

Riferimenti

Utilizzando c o C++ in blocchi di __asm