Das Verhalten des Stapels (Auf- oder Abwachsen) hängt von der Anwendungsbinärschnittstelle (ABI) und der Organisation des Aufrufstapels (auch als Aktivierungsdatensatz bezeichnet) ab.
Während seiner gesamten Lebensdauer muss ein Programm mit anderen Programmen wie dem Betriebssystem kommunizieren. ABI bestimmt, wie ein Programm mit einem anderen Programm kommunizieren kann.
Der Stapel für verschiedene Architekturen kann in beide Richtungen wachsen, für eine Architektur ist er jedoch konsistent. Bitte überprüfen Sie dies Wiki-Link. Das Wachstum des Stacks wird jedoch vom ABI dieser Architektur bestimmt.
Wenn Sie beispielsweise den MIPS ABI verwenden, wird der Aufrufstapel wie folgt definiert.
Betrachten wir, dass die Funktion 'fn1' 'fn2' aufruft. Nun ist der Stapelrahmen von 'fn2' aus wie folgt:
direction of | |
growth of +---------------------------------+
stack | Parameters passed by fn1(caller)|
from higher addr.| |
to lower addr. | Direction of growth is opposite |
| | to direction of stack growth |
| +---------------------------------+ <-- SP on entry to fn2
| | Return address from fn2(callee) |
V +---------------------------------+
| Callee saved registers being |
| used in the callee function |
+---------------------------------+
| Local variables of fn2 |
|(Direction of growth of frame is |
| same as direction of growth of |
| stack) |
+---------------------------------+
| Arguments to functions called |
| by fn2 |
+---------------------------------+ <- Current SP after stack
frame is allocated
Jetzt können Sie sehen, dass der Stapel nach unten wächst. Wenn die Variablen also dem lokalen Rahmen der Funktion zugewiesen werden, wachsen die Adressen der Variablen tatsächlich nach unten. Der Compiler kann die Reihenfolge der Variablen für die Speicherzuordnung festlegen. (In Ihrem Fall kann entweder 'q' oder 's' zuerst der Stapelspeicher zugewiesen werden. Im Allgemeinen führt der Compiler die Stapelspeicherzuweisung jedoch gemäß der Reihenfolge der Deklaration der Variablen durch.)
Bei den Arrays hat die Zuordnung jedoch nur einen einzigen Zeiger, und der zuzuweisende Speicher wird tatsächlich von einem einzelnen Zeiger angezeigt. Der Speicher muss für ein Array zusammenhängend sein. Obwohl der Stapel nach unten wächst, wächst der Stapel für Arrays nach oben.