025
03.08.2005, 14:55 Uhr
kanonenvirus
|
ok dann habe ich die letzte frage an euch. Dazu aber ein kleines Programmchen wa sich schon vorher angegeben hab.
C++: |
#include <iostream.h>
int main2(int, int);
int main() { int x = 50, y = 70; main2(x,y); return 0; }
itn main2(int x, int y) { int z = 80; return (x + y + z); }
|
Und hier ist eine Stelle aus meinem Buch die mich etwas verwirrt. Es handelt sich hierbei um den Stack und sene Datenstruktur wenn man in eine andere Funktion verzweigt. Die Schritte sind folgende: Stack und Funktionen Wenn ein Programm, das auf einem PC unter DOS ausgeführt wird, in eine Funktion verzweigt, passiert folgendes:
1.)Die Adresse im Befehlszeiger wird inkrementiert zu der nächsten Anweisung nach dem Funktionsaufruf. Diese Adresse wird dann auf dem Stack abgelegt und bildet damit die Rückkehradresse für die Funktion, wenn sie zurückkehrt. 2.)Auf dem Stack wird Platz für den von Ihnen deklarierten Rückgabetyp geschaffen. Bei einem System mit 2-Byte-Integers werden im Falle eines als Integer deklarierten Rückgabetyps zwei weitere Bytes dem Stack hinzugefügt. In diesen Bytes wird kein Wert abgelegt. 3.)Die Adresse der aufgerufenen Funktion, die in einem speziellen dafür vorgesehenen Speicherbereich abgelegt wurde, wird in den Befehlszeiger geladen, so daß die nächste ausgeführte Anweisung sich in der aufgerufenen Funktion befindet. 4.)Die aktuelle Spitze des Stacks wird jetzt festgehalten und in einem speziellen Zeiger, dem Stack-Rahmen, abgelegt. Alles, was von jetzt an dem Stack hinzugefügt wird, bis die Funktion zurückkehrt, wird als »lokal« zur Funktion betrachtet. 5.)Alle Argumente an die Funktion werden auf dem Stack plaziert. Die jetzt im Befehlszeiger befindliche Anweisung, das heißt, die erste Anweisung in der Funktion, wird ausgeführt. 6.)Die Funktion legt die in ihr definierten lokalen Variablen auf dem Stack ab.
Ist die Funktion soweit, zurückzukehren, wird der Rückgabewert in dem in Punkt 2 beschriebenen Stack-Bereich abgelegt. Der Stack wird jetzt bis zum Stack-Rahmen-Zeiger aufgelöst, so daß damit alle lokalen Variablen und die Argumente der Funktion entfernt werden.
Der Rückgabewert wird vom Stack geschmissen und als Wert des Funktionsaufrufs zugewiesen. Die in Punkt 1 gespeicherte Adresse wird ermittelt und im Befehlszeiger abgelegt. Das Programm fährt deshalb direkt nach dem Funktionsaufruf mit dem Rückgabewert der Funktion fort.
Einige Details dieser Vorgehensweise sind von Compiler zu Compiler oder unter Computern verschieden, aber die wesentlichen Konzepte sind umgebungsunabhängig. Allgemein gilt, daß Sie bei Aufruf einer Funktion die Rückgabeadresse und die Parameter auf dem Stack ablegen. Solange die Funktion »lebt«, werden die lokalen Variablen dem Stack hinzugefügt. Kehrt die Funktion zurück, werden sie entfernt, indem der Stackbereich der Funktion aufgelöst wird.
Wenn ich dazu meinen Code nehme und die Schritte durchführe dann würde das ungefähr so auf em Stapel aussehen.
48.. variable 49.. Argument 50.. Rückkehradresse
Wenn Ihr es besser wisst erklärt mir die schritte deutlicher dankee.
mod edit: wieso benutzt keiner die CPP Tags selber? Dieser Post wurde am 03.08.2005 um 19:52 Uhr von Pablo editiert. |