Nicht angemeldet. · Kennwort vergessen · Registrieren

pu77tegy
Mitglied seit 07/2012
2 Beiträge
Betreff: Fragen zu Stackaufbau
Hallo,
ich habe zwei Fragen zum Thema Stack(Folien 20-10).

1) Was wird in "main return-addr" und "f1 return-addr" gespeichert.

2) Wohin und wodurch wird der Stackpointer nach verlassen einer Funktion zurückgesetzt. In den Foline steht er nämlich nach f2 hinter den an f2 übergebenen Parametern und bei der Rückkehr zu main vor den an f1 übergebenen Parametern.

mfg Fabian
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Zitat von pu77tegy:
1) Was wird in "main return-addr" und "f1 return-addr" gespeichert.

Der Program Counter -> 14-4

Zitat von pu77tegy:
2) Wohin und wodurch wird der Stackpointer nach verlassen einer Funktion zurückgesetzt. In den Foline steht er nämlich nach f2 hinter den an f2 übergebenen Parametern und bei der Rückkehr zu main vor den an f1 übergebenen Parametern.
Vor dem Return steht er genau vor der Retrun-Adresse, nach dem Return (das passiert impliziert) steht er genau dahinter. Es ist also Aufgabe der Aufgerufenen Funktion, dass der SP vor dem Return an der Richtigen Stelle ist und die Aufrufende Funktion muss die Übergabeparameter wieder "frei geben".
Raim
GSPiC-Guru
Mitglied seit 05/2011
79 Beiträge
Antwort auf Beitrag #1
Zitat von pu77tegy:
Hallo,
ich habe zwei Fragen zum Thema Stack(Folien 20-10).

Ich war kurz verwirrt. Du hast wohl die SPiC-Folien und nicht die GSPiC-Folien gelesen? In den GSPiC-Folien findet sich die gleiche Folie aber bei 16-5.

Zitat von pu77tegy:
1) Was wird in "main return-addr" und "f1 return-addr" gespeichert.

Die Return-Adresse ist jeweils die Anweisung an die nach Abarbeitung der Funktion zurückgekehrt wird. Das ist die Anweisung, die nach dem call im Maschinencode steht.

Zitat von pu77tegy:
2) Wohin und wodurch wird der Stackpointer nach verlassen einer Funktion zurückgesetzt. In den Foline steht er nämlich nach f2 hinter den an f2 übergebenen Parametern und bei der Rückkehr zu main vor den an f1 übergebenen Parametern.

Dafür ist auch der Framepointer (fp) da. Diesem wird beim Betreten der Funktion der aktuelle Stackpointer zugewiesen und beim Return wird dieser Wert in den Stackpointer zurückgeschrieben. Wenn der Framepointer in jeder Funktion gesetzt wird, muss dieser auch vorher auf dem Stack gesichert werden (main-fp bzw. f1-fp). Beim Return wird nach dem Wiederherstellen des Stackpointers noch die Return-Adresse vom Stack geholt und an die dort abgelegte Stelle nach dem Aufruf zurückgekehrt.
Philipp Stenger
StePh88
Mitglied seit 10/2011
5 Beiträge
Im Zusammenhang dazu: Kann man zur Parameterübergabe sagen, dass die Adressen der Funktionsparameter immer relativ zum Framepointer betrachtet werden? Also konkret: dass die aktuellen Parameter immer direkt oberhalb der Rücksprungadresse der Aufrufer Funktion liegen?
pu77tegy
Mitglied seit 07/2012
2 Beiträge
Antwort auf Beitrag #3
Wenn ich das richtig verstehe, dann müsste der Stackpointer nach einem funktionsaufruf doch hinter doch auf den speicher nach den Paramtern zeigen.
Er zeigt in den Folien aber einmal vor (return zu main) und einmal hinter die Parameter (return zu f1) sind dann also die Folien falsch?
Oder wird der Stackpointer von irgend etwas anderem zurückgesetz, sodass die Parameter nicht mehr im benzutzen Stack stehen?
Raim
GSPiC-Guru
Mitglied seit 05/2011
79 Beiträge
Zitat von pu77tegy:
Wenn ich das richtig verstehe, dann müsste der Stackpointer nach einem funktionsaufruf doch hinter doch auf den speicher nach den Paramtern zeigen.

Richtig. Bei Intel IA-32 ist der Aufrufer dafür zuständig, die Parameter wieder vom Stack zu entfernen (sie könnten aber auch direkt weiterverwendet werden).

Zitat von pu77tegy:
Er zeigt in den Folien aber einmal vor (return zu main) und einmal hinter die Parameter (return zu f1) sind dann also die Folien falsch?
Oder wird der Stackpointer von irgend etwas anderem zurückgesetz, sodass die Parameter nicht mehr im benzutzen Stack stehen?

Da hast du Recht, dass ist tatsächlich nicht eindeutig. Das gezeigte Beispiel bezieht sich immer nur auf die markierten C-Anweisungen. Ob der Compiler den Maschinencode so generiert hat, dass die Parameter noch vom Stack entfernt werden oder nicht lässt sich eigentlich nicht erkennen. Der Stackpointer sollte aber eigentlich immer hinter die Parameter zeigen.
Raim
GSPiC-Guru
Mitglied seit 05/2011
79 Beiträge
Antwort auf Beitrag #4
Zitat von Philipp Stenger:
Im Zusammenhang dazu: Kann man zur Parameterübergabe sagen, dass die Adressen der Funktionsparameter immer relativ zum Framepointer betrachtet werden? Also konkret: dass die aktuellen Parameter immer direkt oberhalb der Rücksprungadresse der Aufrufer Funktion liegen?

Ja, wie im gezeigten Beispiel kann man vom Framepointer aus mit positiven Offsets auf die Parameter und mit negativen Offsets auf lokale Variablen zugreifen.
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Antwort auf Beitrag #5
Nochmal etwas ausführlicher (Je nach Architektur kann es kleine Abweichungen geben)

Zitat von pu77tegy:
Oder wird der Stackpointer von irgend etwas anderem zurückgesetz, sodass die Parameter nicht mehr im benzutzen Stack stehen?
Der Stackpointer Zeigt immer vor den Benutzten Bereich des Stacks - also dorthin wo der Stack aufhört.
"Call" schreibt die aktuelle Adresse auf den Stack und erhöht den Stackpointer.
"Ret" liest die Adresse hinter dem Stackpointer und erniedrigt den Stackpointer.

Alles was vor dem Stackpointer liegt, kann jederzeit überschrieben werden. Da ein Interrupt aus sciht des Stacks auch nichts anderes ist als ein spontaner "Call".


Zitat von pu77tegy:
Wenn ich das richtig verstehe, dann müsste der Stackpointer nach einem funktionsaufruf doch hinter doch auf den speicher nach den Paramtern zeigen.
Vor einem Aufruf zeigt er vor die Übergabeparamer. Bei einen Call wird der Programmconter, auf den Stack geschrieben und der Stackpointer automatisch erhöht, so dass diese vor die Rücksprungadresse zeigt.
Danach legt die Aufgerufene Funktion ihre Variablen auf dem Stack ab und verschiebt den Stackpointer entsprechend.

Bevor die Funktion zurück springt, muss sie die lokalen Variablen "abbauen", so dass der Stackpointer vor die Rücksprungadresse zeigt. Bei einem Return wird der Programcounter vom Stack genommen und der Stackpointer entsprechen erhöht, damit diese jetzt vor die übergebenen Parameter zeigt.
Aus diesem Grund _muss_ auch die Aufrufende Funktion die Übergabeparameter wieder abbauen - oder kann sie weiterverwenden. (Anm: Durch geschickte Anordnung der lokalen Variablen kann der Compiler sich unter evtl das Kopieren der Übergabeparameter sparen - aber das ist Optimierung, und nicht teil des Vorlesungsstoffs)

Zitat von pu77tegy:
Er zeigt in den Folien aber einmal vor (return zu main) und einmal hinter die Parameter (return zu f1) sind dann also die Folien falsch?
Ja  Folie 20-10 ist unsauber. Der Gelbe Strich sollt zwischen f1(a,b); und dem return(a) sein. Und die Beschriftung unten links ist IMO ganz verwirrend.
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen