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?
risposta
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.
- 1. Qual è il punto di LEA EAX, [EAX]?
- 2. Come è 1 maggiore di 4?
- 3. perché la dimensione di riferimento è sempre 4 byte - C++
- 4. Il valore di sottostringa dell'indirizzo è sempre 12? La dimensione delle variabili è lieve?
- 5. È il valore restituito IOCTL
- 6. Come ottenere il valore restituito da xcodebuild?
- 7. Acquisisci il valore restituito da PhoneGap Plugin
- 8. Una mappa java può restituire una dimensione di -1?
- 9. byte di valore SQLITE_INTEGER
- 10. Valore restituito da chrome.tabs.executeScript
- 11. Qual è il valore restituito da exec exec()?
- 12. xorl% eax,% eax nel codice assembly x86_64 prodotto da gcc
- 13. Come restituire il valore da Action()?
- 14. ImageMagick può restituire la dimensione dell'immagine?
- 15. Come ottenere il valore restituito da JDBC MSSQL
- 16. valore restituito da script SQL per shell script di
- 17. Java Aspect ha restituito il valore da utilizzare nel metodo
- 18. Come si decide quale dimensione byte [] usare per InputStream.read()?
- 19. Ottieni il valore restituito da fputcsv
- 20. Come creare e ottenere il valore restituito da Cocoa Dialog?
- 21. Il valore restituito da system() è uguale a "$?"?
- 22. Come restituire il valore da una funzione di callback asincrona?
- 23. È possibile restituire "live" JSON utilizzando il rendimento restituito?
- 24. restituito da NSJSONSerialization può variare
- 25. Un metodo di connessione può restituire un valore?
- 26. Qual è il vero significato del valore restituito di `delete`?
- 27. Linux x86 NASM - Subroutine: stampa un dword da EAX
- 28. Valore restituito non restituito variabile
- 29. Ottenere valore restituito da Task.Run
- 30. Può posix read() ricevere meno di 4 byte richiesti da una pipe?
Vedere le risposte a questa domanda: http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –