001
02.08.2005, 15:33 Uhr
virtual
Sexiest Bit alive (Operator)
|
Du kommst normalerweise in einem Programm - in dem oben stehenden auch nicht - aktiv mit dem Stack in berührung. Das machte der Compiler für Dich. Da ist es eigentlich vollkommen irrelevant, wie die Sachen im Stack angeordnet sind: sowas habe ich höchstens hin und wieder mal für Schweinereien gebraucht, welche ich in diesem Forum nicht preisgebe, weil hier zuviele Minderjährige sind.
Naja, was solls...: Auf Intel kompatiblen Prozessoren sieht es so aus, daß man pro Funktionsauf einen sogenannten Stackframe auf den Stack wirft. In Deinem Fall etwa so:
Code: |
4564 Lokale Variable Z 4568 Gesicherter Wert des Stackframe der aufrufenden Fkt. (EBP) 456C Rücksprungadresse 4570 Wert Parameter X 4574 Wert Parameter Y 4578 ... Andere Frames
|
Beachte, daß ein Stack von unten nach oben wächst, dh wenn eine weitere Funktion etwa aufgerufen wird, dann wird der nächste stackframe oben und nicht unten angefügt.
Alle lokalen Variablen und parameter, welche Du in Deiner Routine ansprichst, werden relativ zum Inhalt des Registers EBP angeprochen. Dieses Register wird für jeden Funktionsaufruf neu geladen und der alte Wert ebenfalls auf den Stack zwischengespeichert (siehe Feld 4568).
Beachte weiterhin die Reihenfolge, wie die Rücksprungadresse und die parameter abgelegt werden. In pascal etwa werden die parameter genau umgekehrt abgelaicht. Die Rücksprungadresse wird in C immer als letztes auf den Stack vor dem Funktionseintritt gelegt, was es erlaubt daß eine C Funktion auch dann die Rücksprungadresse zu finden, wenn mehr Parameter als erwartet vom Aufrufere auf den Stack gelegt wurden. Das erst macht sowas wie Variable parameter listen möglich.
Beachte weiterhin, daß das Ergebnis der Funktion nicht über den Stack, sondern in der Regel mit Hilfe eines Registers (EAX) an den Aufrufer zurückgegeben wird.
Dies gilt jedoch alles nur für Intelähnliche Prozessoren. Andere Prozessoren haben zum einen andere Register, zum anderen mag es hier auch weitere Unterschiede geben, wie etwa Ergebnisse an den Aufrufer zurückgegben werden. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |