Stack-erst Parameter dann Func-Addresse warum ?
-
Hallo,
ich frage mich, warum beim Aufruf von Funktionen erst die Funktionsparameter auf den Stack gelegt werden und dann erst die Rücksprungaddresse.
Wäre es nicht sinnvoller das andersrum zu machen ? Ich meine man arbeitet ja noch mit den Parametern der Func in der Func selbst, also popt sie zuerst vom Stack. Dann wird die Func beendet und es wird somit die Rücksprungaddresse benötigt, also erst anschließend vom Stack herabgezogen.Klingt für mich nicht recht einleuchtend...also why is des so ?
Schönen Gruß
Christoph
-
Die übergebenen Argumente müssen natürlich vor Aufruf bereitgestellt werden, da abner beim Aufrufen der Unterfunktion mit CALL automatisch die Rücksprungadresse auf den Stack gepusht wird, müssen die Argumente vorher schon dort platziert werden.
Zwar ist der Stack natürlich eine Last In First Out-Struktur, aber man kann auch beliebig auf seine Inhalte zugreifen und das wird in der Praxis auch so gemacht.
Bei Beginn der Funktion wird der Stackpointer im EBP-Register gesichert, dadurch hat man innerhalb der gesamten Funktion unabhängig von anderen Stackoperationen die Startadresse der eigenen Argumenteliste auf dem Stack griffbereit. Über EBP+4, EBP+8, usw. wird dann auf die Argumente zugegriffen. Am Ende der Funktion wird der eigentliche Stackpointer mit dem Wert von EBP wieder hergestellt und die RET-Anweisung findet die korrekte Rücksprungadresse am Stackpointer vor. Die Argumenteliste ist somit auch ohne POPen wieder aufgeräumt, weil sie im ungültigen Bereich hinter dem Stackpointer liegt.