2013-02-05 10 views
8

In base a Wikipedia, Intel ABI consente di utilizzare EAX, ECX e EDX senza conservarli in una funzione.
Non sono sicuro di cosa significhi "Intel ABI". Questo significa che viene applicato/seguito da tutti i compilatori che prendono di mira le CPU Intel? Sto scrivendo una funzione assembly che verrà chiamata dal codice C. Posso presumere questo per tutti i compilatori? (Sto puntando solo al x86 al momento)Quali registri sono sicuri da utilizzare in una funzione (x86)

risposta

6

Intel ABI è solo una convenzione di chiamata stabilita da Intel.

In generale, come i parametri vengono passati e quali registri vengono salvati o cestinati durante una chiamata di funzione è definita dalla convenzione di chiamata della funzione:

http://en.wikipedia.org/wiki/Calling_convention

In particolare per __cdecl, __stdcall e __fastcall dovresti aspettarti che EAX, ECX ed EDX vengano eliminati e la tua funzione dovrebbe conservare altri registri e ritornare su EAX (o EDX: EAX per i ritorni a 64 bit).

Se non si conosce la convenzione di chiamata che si deve utilizzare, non si dovrebbe scrivere in assembly, dal momento che fare confusione nella convenzione di chiamata può portare a bug sfruttabili nella propria applicazione.

In C, la convenzione di chiamata predefinita è normalmente __cdecl e per le API esportate di Windows è normalmente __stdcall.

+0

Conosco la convenzione di chiamata che devo usare e so che significa per quanto riguarda l'ordine dei parametri e la pulizia dello stack. Non sapevo dei registri. Sai quali compilatori seguono questo ABI? msvc/gcc? – baruch

+0

@baruch Almeno per MSVC, la convenzione di chiamata è specificata nel prototipo della funzione. Il compilatore guarda e fa la cosa giusta. Ad esempio, la def di WSARecv inizia come "int WSAAPI WSARecv'. Il 'WSAAPI' risolve (attraverso diversi #define) su __stdcall. –

+0

@MarcSherman Sono a conoscenza della convenzione di chiamata, ma la parte relativa alla conservazione del registro della convenzione di chiamata? – baruch

1

È l'Intel Application Binary Interface, un insieme di regole che dettano cose come i registri disponibili per l'uso senza salvare, come gli argomenti vengono inseriti nello stack, indipendentemente dal caller o dal callle clean fino ai frame dello stack e così via.

Se si sa che le regole vengono seguite, va bene. Tendo a salvare tutto nel caso (a parte quelle cose che sto usando per restituire informazioni ovviamente).

Ma non è necessariamente applicato a tutti i compilatori e non sarebbe saggio pensarlo a meno che il compilatore non lo specifichi espressamente.

Problemi correlati