2012-03-20 5 views
7

EAX è utilizzato per memorizzare il valore di ritorno della funzione nella piattaforma a 32 bit, mi chiedo solo se la dimensione del valore di ritorno di una funzione è maggiore di 4 byte, come fa eax gestirlo? In questo caso il sistema operativo può salvare il valore di ritorno sullo stack e memorizzare l'indirizzo dello stack in EAX, ma come può il sistema operativo distinguere se il valore memorizzato in EAX è un indirizzo per il valore restituito o è effettivamente il valore di ritorno stesso?Come può restituire il valore restituito da eax store di quale dimensione è maggiore di 4 byte?

+0

Vedere le risposte a questa domanda: http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –

risposta

12

Il chiamante e il chiamato devono concordare ciò che contengono i registri e lo stack. Questo è chiamato calling convention, che fa parte di un concetto più ampio chiamato application binary interface (ABI). Il callee definisce come vuole essere chiamato (ovvero se gli argomenti devono essere nello stack, nei registri, ecc.) E il compilatore assicura che il codice che genera sia conforme alla convenzione di chiamata.

Per quanto riguarda la tua domanda specifica, dipende dall'ABI. A volte se il valore restituito è maggiore di 4 byte ma non superiore a 8 byte, può essere suddiviso in EAX ed EDX. Ma la maggior parte delle volte la funzione chiamante assegna solo della memoria (di solito in pila) e passa un puntatore a questa area alla funzione chiamata.

Si noti inoltre che il ruolo del sistema operativo non è così importante come sembra. Binari con diverse convenzioni di chiamata possono coesistere sullo stesso sistema e i binari possono persino utilizzare internamente diverse convenzioni di chiamata. L'ABI del sistema operativo è importante solo quando il binario chiama le sue librerie di sistema.

Problemi correlati