Condividi tramite


Utilizzando e mantenendo i registri nell'assembly inline

Specifici di Microsoft

Non occorre considerare genere in un log conterrà un valore specificato quando __asm iniziale del blocco.I valori del registro non sono garantiti per essere conservati tra distinto __asm blocchi.Se estremità un blocco di codice inline e iniziarne un altro, non è possibile basarsi sui log nel secondo blocco per mantenere i valori dal primo blocco.__asm il blocco eredita qualsiasi log stima il risultato nel flusso di controllo normale.

Se si utilizzano __fastcall la convenzione di chiamata, il compilatore passa gli argomenti della funzione nei registri anziché sullo stack.Ciò può creare problemi con le funzioni con __asm blocchi perché una funzione non è possibile stabilire quale parametro è in cui il registro.Se la funzione viene visualizzata per ricevere un parametro in EAX e immediatamente archivia il grado di interpretare in EAX, il parametro originale viene perso.Inoltre, è necessario mantenere il registro di ECX in qualsiasi funzione dichiarata con __fastcall.

Per evitare questi conflitti di registro, non utilizzare __fastcall convenzione per le funzioni che contengono __asm blocco.Se si specifica __fastcall la convenzione globalmente con l'opzione del compilatore /Gr, dichiarare ogni contenere di funzione __asm blocco con __cdecl o __stdcall.( __cdecl l'attributo indica al compilatore di utilizzare la convenzione di chiamata c per tale funzione.) Se non si esegue la compilazione con /Gr, evitare dichiararla con __fastcall attributo.

Quando si utilizzano __asm per scrivere il linguaggio assembly nelle funzioni di C/C++, non è necessario mantenere i registri di EAX, di EBX, di ECX, di EDX, di ESI, o di EDI.Ad esempio, nell'esempio POWER2.C in funzioni di scrittura con assembly inline, power2 la funzione non mantiene il valore nel registro di EAX.Tuttavia, l'utilizzo dei registri influirà sulla qualità di codice in quanto l'allocatore del registro non essere utilizzate per archiviare i valori in __asm blocchi.Inoltre, utilizzando EBX, ESI o EDI nel codice assembly inline, si forza il compilatore per salvare e ripristinare i registri nel prologo e nell'epilogo di funzione.

È consigliabile mantenere altri registri utilizzati (come DS, ss, SP, B.P. e contrassegna i log) per l'ambito di l __asm blocco.È consigliabile mantenere l'ESP e i registri EIP a meno che siano qualche motivo modificarli (per passare gli stack, ad esempio.Vedere ottimizzare assembly inline.

Alcuni tipi di SSE richiedono allineamento dello stack di otto-byte, forzando il compilatore di generare il codice dinamico di stack-allineamento.Per poter accedere sia le variabili locali nei parametri della funzione dopo l'allineamento, il compilatore gestisce due puntatori ai frame.Se il compilatore esegue omettendo (FPO) un puntatore ai frame, utilizzerà il EBP e l'ESP.Se il compilatore non esegue l'omissione dei puntatori, utilizzerà EBX e il EBP.Per garantire il codice viene eseguito correttamente, non modificare EBX nel codice misto c se la funzione richiede l'allineamento dinamico dello stack come possibile modificare il puntatore a frame.Spostare i tipi allineati otto-byte dalla funzione, oppure evitare l'utilizzo di EBX.

[!NOTA]

Se il codice assembly inline modifica il flag di direzione utilizzando le istruzioni del CLD o di STD, è necessario ripristinare il flag il valore originale.

Microsoft FINALE specifico

Vedere anche

Riferimenti

Assembler inline