Warum werden Funktionsparameter früher im Aufrufstapel als die Rücksendeadresse verschoben?

8

Von Ссылка

Ich frage mich, warum die Rücksprungadresse für eine Funktion über den Parametern für diese Funktion platziert wird?

Es macht mehr Sinn, die Rückgabeadresse vor den Parametern für die Drawline auf den Stapel zu schieben, da die Parameter nicht mehr benötigt werden, wenn die Absenderadresse wird angezeigt, um zur aufrufenden Funktion zurückzukehren.

Was sind die Gründe, die Implementierung im obigen Diagramm zu bevorzugen?

    
Lazer 12.02.2012, 12:12
quelle

2 Antworten

5

Die Rückkehradresse wird normalerweise über den Maschinenbefehl call [in der Anweisungsliste ] der Muttersprache angegeben. während die Parameter und Variablen mit mehreren Maschinenbefehlen geschoben werden - was der Compiler erstellt.

Somit ist die Rücksprungadresse das Letzte, was vom Aufrufer geschoben wird und vor allem [lokale Variablen], die vom Angerufenen gedrückt werden.

Die Parameter werden alle vor die Rücksprungadresse geschoben, weil der Sprung zur eigentlichen Funktion und das Einfügen der Rücksprungadresse in den Stapel im selben Maschinenbefehl erfolgt .

Auch ein anderer Grund ist - der Aufrufer ist derjenige, der Speicherplatz für die Parameter auf dem Stapel zuweist - Es [der Anrufer] sollte auch derjenige sein, der es aufräumt.

    
amit 12.02.2012, 12:15
quelle
1

Der Grund ist einfach: Die Funktionsargumente werden von der aufrufenden Funktion auf den Stack geschoben (die einzige, die das tun kann, weil sie nur die notwendigen Informationen hat; schließlich geht es darum, sie zu übergeben Informationen zur aufgerufenen Funktion). Die Rückgabeadresse wird vom Funktionsaufrufmechanismus an den Stapel gesendet. Die Funktion heißt nachdem die aufrufende Funktion die Parameter eingerichtet hat, weil nach dem Aufruf die aufgerufene Funktion ausgeführt wird, nicht die aufrufende Funktion.

OK, jetzt könnten Sie argumentieren, dass die aufrufende Funktion die Parameter über den aktuell verwendeten Stapel hinaus setzen könnte, und die aufgerufene Funktion könnte dann den Stapelzeiger entsprechend anpassen. Aber das würde nicht gut funktionieren, weil es zu jeder Zeit einen Interrupt oder ein Signal geben könnte, das den aktuellen Zustand auf den Stack schieben würde, um ihn später wiederherzustellen (ich wäre nicht überrascht, wenn ein Task-Schalter dies auch tun würde). . Wenn Sie jedoch die Parameter über den aktuellen Stapel hinaus einrichten, würden diese asynchronen Ereignisse sie überschreiben, und da Sie nicht vorhersagen können, wann sie eintreten werden, können Sie dies nicht vermeiden (abgesehen von der Deaktivierung, die andere Nachteile haben oder sogar unmöglich sein kann) Task-Schalter). Grundsätzlich muss alles jenseits des aktuellen Stacks als volatil betrachtet werden.

Beachten Sie auch, dass dies unabhängig von der Frage ist, wer die Parameter bereinigt. Im Prinzip könnte die aufgerufene Funktion Aufrufdestruktoren der Argumente aufrufen, selbst wenn sie physikalisch im Stapelrahmen des Aufrufers liegen. Außerdem haben viele Prozessoren (einschließlich des x86) Anweisungen, die bei der Rückkehr automatisch zusätzlichen Speicherplatz oberhalb der Rückkehradresse auffüllen (Pascal-Compiler haben das normalerweise getan, weil Sie in Pascal keine Säuberung mehr haben, als Speicher zurückgibt, und zumindest für die zu dieser Zeit war es effizienter, mit dieser Prozessoranweisung aufzuräumen (ich habe keine Ahnung, ob das für moderne Prozessoren immer noch zutrifft). Allerdings hat C diesen Mechanismus aufgrund von Argumentlisten mit variabler Länge nicht verwendet: Der Mechanismus war nicht anwendbar, da Sie zur Kompilierungszeit wissen müssten, wie viel zusätzlichen Speicherplatz freizugeben ist, und K & amp; RC musste keine Variadic-Funktionen weiterleiten (C89 tut dies, aber nur wenige, wenn Compiler dies ausnutzen, aufgrund der Kompatibilität mit altem Code), so gab es keine Möglichkeit für die aufrufende Funktion zu wissen, ob die Argumente zu bereinigen, es sei denn, dass es immer tun musste.

    
celtschk 12.02.2012 12:25
quelle

Tags und Links