Der Programmstack

Stackpointer (Motorola: SP alias A7; Intel: ESP), frame pointer (Motorola: beliebig, beispielsweise A6; Intel: EBP)

Soviel abgelegt wird, soviel muß auch wieder aufgeräumt werden.

einen Wert ablegen: den Stackpointer um die Byteanzahl des zu abzulegenden Werts erniedrigen, dann den Wert an die Adresse kopieren, die im Stackpointer steht

aufräumen: den Stackpointer um die Anzahl der abgelegten Bytes erhöhen

begrenzte Größe: Schachtelungstiefe von Unterprogrammen, Rekursion

Nach Ende eines Unterprogrammaufrufs wird der freigegebene Bereich für die nächsten Aufrufe genutzt.

Was kommt im Stack vor?

Also legt der Aufrufer eines Unterprogramms eventuell Registerinhalte oder ähnliches ab, soweit er fürchten muß, daß der Aufruf diese zerstört, dann zumindest die Argumente und die Rücksprungadresse.

Das aufgerufene Unterprogramm rettet als erstes meist den Wert des Registers, das als frame pointer verwendet wird auf den Stack, anschließend den dann aktuellen Stackpointer in das frame pointer-Register. Während des Abarbeitens dieses Unterprogramms wird der frame pointer nicht mehr verändert und dazu verwendet, um relativ zu der darin enthaltenen Adresse auf die übergebenen Argumente und die eigenen automatischen Variablen zuzugreifen. Dadurch daß dafür nicht mehr der Stackpointer, sondern der frame pointer verwendet wird, steht es dem Unterprogramm frei, den Stackpointer zu manipulieren: zum Aufruf weiterer Unterprogramme müssen ja Werte auf dem Stack abgelegt werden, was den Stackpointer wieder verändert.

Wenn ein Unterprogramm seine Arbeit erledigt hat, kann es umgekehrt den Wert des frame pointers in den Stackpointer zurückkopieren. Anschließend kann über den Stackpointer die Rücksprungadresse in den program counter geladen werden, und der Programmlauf liegt wieder beim Aufrufer.

Der Aufrufer räumt (zumindest in C-/C++-Programmen) die Argumente vom Stack, indem er den Stackpointer um soviele Bytes erhüht, wie er als Argumente abgelegt hat.

Ein vollständiges kleines Beispiel ist im nächsten Abschnitt durchexerziert.



Unterabschnitte
AnyWare@Wachtler.de