Hat der Rückgabewert immer in eax-register nach einem Methodenaufruf?
Ich geschrieben habe einen Haken-Bibliothek, die untersucht, wie ein PE ausführbaren Dateien, dll-import-Tabelle zu erstellen, eine Bibliothek, ermöglicht ändern von Parametern und Rückgabewerte. Ich habe ein paar Fragen auf, wie die return-Wert übergeben von einer Funktion.
Habe ich gelernt, dass der Rückgabewert einer Funktion gespeichert ist, in den Akkumulator. Ist dies immer der Fall? Wenn nicht, wie weiß der compiler wissen, wo sich für das Ergebnis der Funktion?
Was ist mit der return-Typ Größe? Eine ganze Zahl wird leicht zu passen, aber was ist eine Gesamtstruktur? Hat der Anrufer die reserve Stapel den Raum, so dass die Methode ruft es schreiben konnte das Ergebnis auf stack?
- Warum nicht kompilieren ein paar Beispiele und finden Sie für sich selbst?
- Nein, der ARM7-Prozessor nicht im EAX-register. Weder andere Prozessoren.
- Natürlich, wenn der return-Typ passt nicht in
eax
es kann nicht dabei sein. Finden Sie in der Dokumentation von was auch immer-Aufrufkonvention, die Sie verwenden. - Bottom line: es kommt auf den compiler und den Konventionen, die es verwendet. (Ich Baue einen compiler, der vergeht, double float args in EAX/EDX [manchmal]).
- nicht, wenn die Methoden, die "void" zurückgeben und pass-Werte durch Referenzen oder Pointer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist alles spezifisch für die Aufrufkonvention.
Für die meisten Aufrufkonventionen floating-point-zahlen, die entweder auf den FPU-stack oder in XMM-Register.
Aufruf der Funktion Rückgabe einer Struktur
erstellt werden, in etwa äquivalent von:
Bearbeiten: (info ergänzen)
nur zur Klarstellung: dies funktioniert für alle structs und Klassen auch wenn
sizeof(some_struct) <= 4
. Also, wenn Sie definieren kleine nützliche Klasse wieip4_type
mit nurunsigned
Feld und einige Konstruktoren/Konverter zu/tromunsigned
,in_addr
,char*
es wird mangelnde Effizienz im Vergleich zur Verwendung von raw -unigned
Wert.Wenn die Funktion inlined, das Ergebnis wird nicht gespeichert in eax, auch wenn die Ergebnisse weitergegeben werden, die durch Verweis/Zeiger, dass register nicht verwendet werden.
schauen, was passiert, auf eine Funktion, die Rendite verdoppelt (auf einer 32-bit Maschine)
doubles sind nicht in eax.
Es hängt wirklich von der Aufrufkonvention verwendet, aber in der Regel
EAX
ist für 32-bit und kleinere Integrale Datentypen, Fließkomma-Werte tendieren dazu, die Verwendung der FPU-oder MMX-Register und die 64-bit-integral-Typen neigen dazu, verwenden Sie eine Kombination vonEAX
undEDX
statt. Dann gibt es das Problem der komplexen Klasse/struct-Typen, in dem Fall der compiler entscheiden kann, zu optimieren entfernt, der Rückgabewert und die Verwendung eines zusätzlichen output-parameter auf den Aufruf-stack zu übergeben Sie das zurückgegebene Objekt durch die Referenz an den Aufrufer.Sie Fragen über die ABI (Application Binary Interface). Dies variiert je nach Betriebssystem. Sie sollten es nachschlagen. Hier finden Sie einige gute Infos und links zu anderen Dokumenten bei http://en.wikipedia.org/wiki/X86_calling_conventions
Ihre Frage zu beantworten, ja, soweit ich weiß, alle gängigen Betriebssysteme verwenden Ein register, um das Ergebnis zurückzugeben.