Forum: Mikrocontroller und Digitale Elektronik Was ist Heap, was ist Stack?


von Yussuf1 (Gast)


Lesenswert?

Hallo,

ich bin Einsteiger in Sachen µC. Was ist eigentlich mit STack und Heap 
gemeint? Ich kenne nur ROM und RAM (Flash).  Festspeicher und 
Arbeitsspeicher.

Vielen Dank
Yussuf

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Stack und Heap sind ROM und RAM eines Computers.

>>> EDIT durch Moderator:                      <<<
>>> Achtung, liebe Schüler, nicht abschreiben. <<<
>>> Diese Antwort ist falsch!!!                <<<

von Stefan E. (sternst)


Lesenswert?


von Icke ®. (49636b65)


Lesenswert?

Der Stack ist ein Stapel und der Heap ein Haufen. Ordentliche 
Programmierer legen Rücksprungadressen auf den Stack, schlampige lassen 
alles auf einem Haufen rumliegen...

Guckst du ;-):

http://de.wikibooks.org/wiki/C++-Programmierung/_Speicherverwaltung/_Stack_und_Heap#Auf_dem_Heap_.28deutsch:_Halde.29

von Klaus W. (mfgkw)


Lesenswert?

Kan asta schrieb:
> STack und Heap sind ROM und RAM eines Computers.

Aber nur, wenn man die Chips davon auslötet und aufeinanderhäuft oder 
aufstapelt.

von Jens G. (jensig)


Lesenswert?

>Stack und Heap sind ROM und RAM eines Computers.

Schöne Hypothese ...

Stack ist vorrangig für die Zwischenspeicherung der Rücksprungaddresse 
bei bei Unterfunktionsaufrufen, und evtl. irgendwelcher Register, 
irgendwelche Daten/Variablen zuständig.

Heap für Abspeicherung irgendwelcher "Arbeitsdaten" im Speicher.
Beides ist letztendlich einfach nur RAM.

von Yussuf1 (Gast)


Lesenswert?

Ich versteh das irgendwie nicht.

Meine Variablen die ich deklarierer werden also alle auf dem Stack 
gestapelt ?!Diese Ansammlung meiner Variablen ist also der Stack.

und der Heap ist auch der ort wo ich meine Variablen speichere aber 
irgendwie gehäuft?

:D

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Yussuf1 schrieb:
> Meine Variablen die ich deklarierer werden also alle auf dem Stack
> gestapelt ?!

Nur die lokalen einer Prozedur, nicht die globalen.

Yussuf1 schrieb:
> Diese Ansammlung meiner Variablen ist also der Stack.

Falsch. Der Stack kann mehr.

Yussuf1 schrieb:
> nd der Heap ist auch der ort wo ich meine Variablen speichere aber
> irgendwie gehäuft?

Ein Haufen im RAM.

von Yussuf1 (Gast)


Lesenswert?

ich kann stack reservieren bzw. alokieren und heap nicht ?

von Peter D. (peda)


Lesenswert?

Yussuf1 schrieb:
> Was ist eigentlich mit STack und Heap
> gemeint?

Hängt vom Kontext ab.

Bei einem Compiler könnten das verschiedene Stacks sein, das ist dann in 
dem konkreten Compiler-Manual erklärt.

Manche Compiler benutzen verschiedene Stacks für Calls, Variablen und 
Malloc.


Peter

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Reservieren und Allokieren geht nur mit einem Haufen.

Stack u. Heap sind grundsätzliche Speicherformen. Das Basiswissen dazu 
sollte man sich nicht von irgendwelchen Trollen in irgendeinem Forum 
vorkauen lassen. Ein kurzer Blick in ein vernünftiges Buch tut nicht 
weh!

von Simon K. (simon) Benutzerseite


Lesenswert?

Kan asta schrieb:
> Reservieren und Allokieren geht nur mit einem Haufen.

Unsinn.
http://www.kernel.org/doc/man-pages/online/pages/man3/alloca.3.html

> Stack u. Heap sind grundsätzliche Speicherformen. Das Basiswissen dazu
> sollte man sich nicht von irgendwelchen Trollen in irgendeinem Forum
> vorkauen lassen. Ein kurzer Blick in ein vernünftiges Buch tut nicht
> weh!

Haha, richtig! Und trotzdem schreibst du hier schon deinen 3. Beitrag.

"Stack" und "Heap" beschreibt, in welcher Art und Weise, bzw. mit 
welcher Logik irgendwas systematisch in einem Teil eines linearen(?) 
Speichers abgelegt wird.

von Karl H. (kbuchegg)


Lesenswert?

Stack und Heap sind einfach nur 2 verschiedene Organisationsformen, wie 
SPeicher verwaltet wird.

Bei einem Stack hast du einen sauber gestapelten Haufen Teller.
Brauchst du welche, dann nimmst du die Teller von oben einzeln ab und 
wenn du die Teller zurückgeben willst, dann legst du sie in umgekehrter 
Reihenfolge wieder auf den Stapel drauf.

Heap ist eine Kiste mit Tellern. Wer auch immer 10 Teller braucht, nimmt 
sich 10 Teller aus der Kiste (solange noch welche da sind) und wenn er 
sie nicht mehr braucht, wirft er sie zurück.

von UR-Schmitt (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> wirft er sie zurück.

Man sollte in dem Kontext des Vergleichs vieleicht erwähnen, daß Karl 
Keinz Speicher-teller unzerbrechlich sind :-)

von Thomas E. (thomase)


Lesenswert?

UR-Schmitt schrieb:
> Man sollte in dem Kontext des Vergleichs vieleicht erwähnen, daß Karl
> Keinz Speicher-teller unzerbrechlich sind :-)
Nein, sind sie nicht.
Aber wenn welche kaputt sind, kommt seine Frau und macht die Garbage 
Collection.

mfg.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Aber wenn welche kaputt sind, kommt seine Frau und aligned die Teller 
wieder.

von Bronco (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Heap ist eine Kiste mit Tellern. Wer auch immer 10 Teller braucht, nimmt
> sich 10 Teller aus der Kiste (solange noch welche da sind) und wenn er
> sie nicht mehr braucht, wirft er sie zurück.

Ob der OT wohl versteht, daß Deine Kiste mit zunehmender Auslastung 
immer leerer wird, aber sein Heap immer voller ;)

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Bronco schrieb:
> Ob der OT wohl versteht, daß Deine Kiste mit zunehmender Auslastung
> immer leerer wird, aber sein Heap immer voller ;)

Ist alles ne Frage, wie man push und pop definiert. Und in welche 
Richtung der Stack wächst.

von UR-Schmitt (Gast)


Lesenswert?

Kan asta schrieb:
> Ist alles ne Frage, wie man push und pop definiert. Und in welche
> Richtung der Stack wächst.

Du verwechselt schon wieder was.

von Bronco (Gast)


Lesenswert?

Kan asta schrieb:
> Ist alles ne Frage, wie man push und pop definiert.

Push und Pop auf dem Heap? Wohl eher Peek und Poke ;)

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

UR-Schmitt schrieb:
> Du hast vollkommen Recht.

Es ging um den Tellerkisten-Stack.

von Klaus W. (mfgkw)


Lesenswert?

Bronco schrieb:
> Push und Pop auf dem Heap?

Wieso nicht?
1
    ...
2
    ptr = malloc( 500 );
3
    strcpy( ptr, "push, pop" );
4
    ...

von Karl H. (kbuchegg)


Lesenswert?

Bronco schrieb:
> Karl Heinz Buchegger schrieb:
>> Heap ist eine Kiste mit Tellern. Wer auch immer 10 Teller braucht, nimmt
>> sich 10 Teller aus der Kiste (solange noch welche da sind) und wenn er
>> sie nicht mehr braucht, wirft er sie zurück.
>
> Ob der OT wohl versteht, daß Deine Kiste mit zunehmender Auslastung
> immer leerer wird, aber sein Heap immer voller ;)

Hmm. Da ist was drann. :-)

So weit wird er ja doch noch abstrahieren können, dass die Teller für 
den freien Speicher stehen, der mit zunehmender Auslastung immer weniger 
wird.

von Klaus W. (mfgkw)


Lesenswert?

Optimist!
Jemand, der die grundlegendsten Sachen nicht im Internet findet?

von Max D. (max_d)


Lesenswert?

Im Stack sind hauptsächlich temporäre Daten wie Rücksprungadressen und 
gesicherte Register.  Der Stack wächst von oben nach unten (Anfang ist 
am oberen Ende des Rams). Wenn eine Funktion gecallt wird dann speichert 
das System die Rücksprungadresse und die Register auf den Stack. Wenn 
die Funktion dann fertig ist holt sie die Regel wieder in umgekehrter 
Reihenfolge zurück und springt dann letztendlich zurück . Im Heap lagern 
Variablen und Arrays welche dauerhaft auf einer festen Adresse liegen 
undkit nen Pointer genutzt werden.

PS: auch wenn es jeden irgendwo nen obsoleten Controller gibt der das 
anderen HRS macht, hier gehts um den Standard und der sieht so aus...

von Klaus W. (mfgkw)


Lesenswert?

Max D. schrieb:
> Im Heap lagern
> Variablen und Arrays welche dauerhaft auf einer festen Adresse liegenMax D. schrieb:
> hier gehts um den Standard und der sieht so aus...

naja

von Peter D. (peda)


Lesenswert?

Der Stack ist ein Haufen RAM, auf den der wieder Speicher draufpacken 
muß, der ihn auch runter genommen hat.

Der Heap ist ein Haufen RAM, wo ein anderer was rauf packen und runter 
nehmen kann. Dazu ist aber zusätzlicher Verwaltungsaufwand nötig.
Zusätzlich kann es passieren, daß die Stücke nicht mehr lückenlos rein 
passen. Da muß dann der Garbage-Collector ran.


Peter

von Yussuf1 (Gast)


Lesenswert?

Diese Informationen sind genau die ich gesucht habe :D

das :

Stack und Heap sind einfach nur 2 verschiedene Organisationsformen, wie
SPeicher verwaltet wird.

Bei einem Stack hast du einen sauber gestapelten Haufen Teller.
Brauchst du welche, dann nimmst du die Teller von oben einzeln ab und
wenn du die Teller zurückgeben willst, dann legst du sie in umgekehrter
Reihenfolge wieder auf den Stapel drauf.

Heap ist eine Kiste mit Tellern. Wer auch immer 10 Teller braucht, nimmt
sich 10 Teller aus der Kiste (solange noch welche da sind) und wenn er
sie nicht mehr braucht, wirft er sie zurück.

+

unzerbrechliche Teller

+

Ob der OT wohl versteht, daß Deine Kiste mit zunehmender Auslastung
immer leerer wird, aber sein Heap immer voller ;)


:D ich habs verstanden XD

von Simon K. (simon) Benutzerseite


Lesenswert?

@Yussuf1: Wow, du hast wirklich nur die korrekten Informationen aus den 
Posts entnommen. Ich bin stark beeindruckt.

Max D. schrieb:
> Im Stack sind hauptsächlich temporäre Daten wie Rücksprungadressen und
> gesicherte Register.
> ...

Das hat überhaupt nichts mit Stack zu tun. Ein Stack ist wie oben 
genannt nur eine Organisationsform von Daten im Speicher.

Was du meinst ist: Die meisten Mikroprozessoren benutzen einen 
Hardware-Stack in ihrem Hauptspeicher um Rücksprungadressen abzulegen.
Es kann aber auch noch zusätzliche Stacks geben, um beispielsweise 
funktionslokale Variablen in Hochsprachen speichern zu können. Oft wird 
dafür aber der Hardware-Stack mitbenutzt.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Schon wieder falsch, Simon. Dein "Hardwarestack" hat einen Offset.

von Bronco (Gast)


Lesenswert?

Gibt es eigentlich auch einen TCP/IP-Heap (als Gegenstück zum 
TCP/IP-Stack)?

von Simon K. (simon) Benutzerseite


Lesenswert?

Kan asta schrieb:
> Schon wieder falsch, Simon. Dein "Hardwarestack" hat einen Offset.

Unsinn.
Es gibt auch Hardware-Stacks die gar nicht im RAM operieren, sondern in 
Registerform gehalten werden.

http://en.wikipedia.org/wiki/PIC_microcontroller#Stacks
ATtiny11/12/15

Der Artikel hier ist doch ganz gut:
http://www.mikrocontroller.net/articles/Stack

Könntest du dir ja mal durchlesen, um in Zukunft nicht mehr so viel 
Unsinn zu erzählen.

von Karl H. (kbuchegg)


Lesenswert?

Simon K. schrieb:
> Kan asta schrieb:
>> Schon wieder falsch, Simon. Dein "Hardwarestack" hat einen Offset.
>
> Unsinn.
> Es gibt auch Hardware-Stacks die gar nicht im RAM operieren, sondern in
> Registerform gehalten werden.

Und wer ein Beispiel in der anderen Richtung sucht, der möge sich zb mal 
den Stack-Frame einer VAX ansehen.

von Edson (Gast)


Lesenswert?

Simon K. schrieb:
> @Yussuf1: Wow, du hast wirklich nur die korrekten Informationen aus den
> Posts entnommen. Ich bin stark beeindruckt.

Daraus kann man schliessen, dass du zu viele Trolle gefüttert hast und 
Yussuf anscheinend kein Troll ist.

> Gibt es eigentlich auch einen TCP/IP-Heap (als Gegenstück zum
> TCP/IP-Stack)?

Quark. Auch wurde nirgends behauptet, dass der Stack das Gegenstück zum 
Heap sei. Ist so, als würdest du einen Autositz als Gegenstück zum 
Handschuhfach betrachten...

von Edson (Gast)


Lesenswert?

PS. Der zweite Kommentar bezieht sich auf Bronco, 03.09.2012 16:11

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Simon K. schrieb:
> Es gibt auch Hardware-Stacks die gar nicht im RAM operieren, sondern in
> Registerform gehalten werden.

Da sage ich: Unsinn.
Ein Stack ist immer in Hardware umgesetzt, entweder per Zeiger-Register, 
oder halt direkt in Registern. "Softwarestacks" existieren eigentlich 
nur zu Übungs- und Lehrzwecken.

von Frank B. (frank501)


Lesenswert?

Ist doch ganz einfach.
Z.B. die Rücksprungandressen werden auf den Stack (stapel) gespeichert. 
Und wenn der Sack um fällt, liegt alles auf dem Heap (Haufen)


SCNR

von UR-Schmitt (Gast)


Lesenswert?

Kan asta schrieb:
> Da sage ich: Unsinn.
> Ein Stack ist immer in Hardware umgesetzt, entweder per Zeiger-Register,
> oder halt direkt in Registern. "Softwarestacks" existieren eigentlich
> nur zu Übungs- und Lehrzwecken.

Du schreibst hier zum widerholten Mal Unsinn.
Siehe Hardwarestacks der alten kleinen PICs.
Siehe Stacks als Objekte in modernen objektorientierten 
Programmiersprachen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Heap ist eine Kiste mit Tellern. Wer auch immer 10 Teller braucht, nimmt
> sich 10 Teller aus der Kiste (solange noch welche da sind) und wenn er
> sie nicht mehr braucht, wirft er sie zurück.

UR-Schmitt schrieb:
> Man sollte in dem Kontext des Vergleichs vieleicht erwähnen, daß Karl
> Keinz Speicher-teller unzerbrechlich sind :-)

Doch, die sind zerbrechlich. Das Zerscheppern der Teller heißt in der
Fachsprache "Speicherfragmentierung"  (lat. frangere brechen, fragmentum
Bruchstück). Irgendwann sind die Bruchstücke so klein, dass kein Essen
mehr darauf Platz hat. Dann müssen die Stücke wieder zusammengeklebt,
der Speicher also defragmentiert werden :)

von Yussuf1 (Gast)


Lesenswert?

Ich glaub, diese Diskussion war mal nötig :D

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Oh UR-Schmitt, jetzt lass doch mal gut sein mit deinen
langsamen Softwarestacks. Schon wieder Ferien?

von Peter D. (peda)


Lesenswert?

Kan asta schrieb:
> "Softwarestacks" existieren eigentlich
> nur zu Übungs- und Lehrzwecken.

Nö, die haben schon praktischen Sinn.

Der AVR-GCC legt für lokale Variablen einen Stackframe an.
Der IAR führt dagegen einen Softwarestack mit und kann dadurch schneller 
und codesparender arbeiten.
Dafür wurde extra während der AVR-Entwicklung noch ein drittes 
Pointeregister hinzugefügt.

Und beim 8051 wird der Softwarestack benötigt, sobald man das 
Large-Speichermodell (64kB RAM) auswählt, da der originale Stackpointer 
(max 256Byte) dann zu klein ist.


Peter

von Simon H. (simi)


Lesenswert?

Obwohl "frangere" zerbrechen heisst, wäre das mit der 
Speicherfragmentierung wohl eher mit meinem Labortisch zu vergleichen.

Ich lege hier meinen Lötkolben ab, da die Lötsauglitze, dann dort noch 
das Lötzinn, das Multimeter muss auch noch Platz haben, dann (achtung, 
jetzt kommt ein kompliziertes Intermezzo) ein Stapel Papier - das wäre 
jetzt, um die Verwirrung komplett zu machen, ein Task, der einen eigenen 
Stack hat, der aber im Heap des Systems allokiert wird.... So. Und 
obwohl ich flächenmässig noch massig Platz auf dem Labortisch zur 
Verfügung habe, passt das Oszi jetzt einfach nicht mehr drauf. Entweder 
ich lege es auf den Lötzinn, oder auf das Multimeter, oder auf den 
Papierstapel....

Also muss ich erst mal alles beiseite räumen, so, dass alles in einer 
Ecke ist, und ich Platz habe für das Oszi. Das ist dann die 
Defragmentierung.  :-)

von UR-Schmitt (Gast)


Lesenswert?

Kan asta schrieb:
> STack und Heap sind ROM und RAM eines Computers.

Kan asta schrieb:
> Ist alles ne Frage, wie man push und pop definiert. Und in welche
> Richtung der Stack wächst.
Im MKontext zu einem Heap wohlgemerkt

Kan asta schrieb:
> Ein Stack ist immer in Hardware umgesetzt

Kan asta schrieb:
> Oh UR-Schmitt, jetzt lass doch mal gut sein mit deinen
> langsamen Softwarestacks. Schon wieder Ferien?
Junge junge, du solltest wirklich erst mal selbst dein Wissen etwas 
erweitern, ehe du den Mund hier so voll nimmst.
Es gibt eine Welt jenseits von 8K Code und 1K Ram Größe.

Ach so wegen Ferien: Wenn du nicht weisst ob du schon wieder zur Schule 
musst dann hilft dir das vieleicht weiter:
http://www.schulferien.org/Schulferien_nach_Jahren/2012/schulferien_2012.html

von El Patron B. (bastihh)


Lesenswert?

Rofl!

Ist das lustig.. Zitat vom Wiki-Link:

>Tun Sie dies nicht, erhalten Sie höchst bemerkenswerte Meldungen von 
>Laufzeitumgebung oder Betriebssystem.

Göttlich! :D

von Karl H. (kbuchegg)


Lesenswert?

Kan asta schrieb im Beitrag #2820163:

> Aus meiner Sicht reinster Schwachsinn,

Komm wieder runter und akzeptiere, dass es da draussen viele 
Architekturen gibt, die du nicht kennst.

Im übrigen steht im C-Standard kein Wort von Stack und/oder Heap.

von Klaus W. (mfgkw)


Lesenswert?

Den ganzen Thread kann man löschen.
Das bi0chen, was korrekt ist, steht schon in jedem besseren Buch und im 
Netz.
Der größte Teil hier ist für die Katz und ein Armutszeugnis für dieses 
Forum.

von amateur (Gast)


Lesenswert?

Stack oder Stapel – die hundertste Erläuterung

Der Stapel ist eine einfache und schnelle Möglichkeit um Daten zu 
speichern. Eines der Hauptkriterien ist: Der Anwender braucht sich nicht 
um die Adressierung zu kümmern. Wie beim „echten“ Tellerstapel ist es 
unwichtig ob Du der Erste bist, der seinen Teller ablegt oder ob bereits 
Teller auf dem Stapel liegen. Ganz wichtig ist hierbei die Disziplin 
bzw. die Reihenfolge. Legst Du zwei Teller auf den Stapel, so musst Du 
auch wieder zwei Teller vom Stapel nehmen. Kommt jetzt zwischenzeitlich 
eine zweite Person und legt ihren Teller obenauf, so ist auch für sie 
ebenfalls unwichtig wie viele Teller auf dem Stapel liegen, wichtig ist 
nur dass die zweite Person ihren Teller auch als erstes herunternimmt. 
Dann können Sie wieder ihre Teller erreichen. Der oberste Teller den Sie 
herunternehmen ist natürlich der, den Sie als letztes darauf gelegt 
haben. Der darunterliegende Teller ist der den Sie zuerst auf den Stapel 
legten. Aus diesem Grunde hat sich für den Stapel auch der Name LiFo 
eingebürgert. Das ist das Kürzel für Last In – First out. Das Rein wird 
allgemein als Push, das Raus Pop genannt. Ein weiteres Rein kommt bei 
einem Unterprogrammaufruf (call) zustande und das zugehörige Raus 
beendet ein Unterprogramm (ret[turn]).

Warum das Ganze. Es gibt viele Stellen im Programm, an denen 
vorübergehend Variablen und Werte aller Art gespeichert werden müssen. 
Das Schlüsselwort ist hierbei vorübergehend.
Ein einfaches Beispiel:

unsigned char Unterprogramm ( void )        [00]
{                                           [01]
  Var1 = 17;          ; Register18 = 0x11   [02]
  Var2 = 20;          ; Register19 = 0x14   [03]
  return Var2 * Var1;                       [04]
}                                           [05]

; Im Hauptprogramm                          [07]
Var1 = 12;          ; Register18 = 0x0c     [08]
Var2 = 45;          ; Register19 = 0x2d     [09]
If (Var0 == 0) Var3 = Unterprogramm1();     [10]
…                                           [11]
…

Was passiert hier: Genaugenommen weis das keiner. Es gibt zwei 
Möglichkeiten.
1. 07, 08, 09, 10, 11 …
2. 07, 08, 09, 10, 00, 01, 02, 03, 04, 05, 11 …
Der tatsächliche Ablauf ist wegen der Abfrage unbekannt.

Relevant sind die folgenden Fakten: Ein Prozessor hat nur eine begrenzte 
Anzahl an internen (sprich schnellen) Speichern/Registern. Nicht alle 
Operationen können mit allen Registern durchgeführt werden.

Der Stapel wird üblicherweise auf das physikalische Speicherende 
gesetzt. Z.B. 0x3FF. Auf der Stapelebene sieht der Ablauf folgendermaßen 
aus:
Mit Verzweigung
[07]  0x3ff
[08]  0x3ff
[09]  0x3ff
[10]  0x3ff  „11“  ; Der Aufruf einer Unterfunktion call sichert die 
Rücksprungadresse
      0x3fe        ; Der vom Prozessor verwaltete Stackpointer wird um 1
                   ; verringert
[00]  0x3fe        ; Der Compiler weiss dass zwei Variablen „zerstört“
                   ; werden
                   ; und sichert diese
[01]  0x3fe  „12“  ; Push Register18
      0x3fd        ; Der vom Prozessor verwaltete Stackpointer wird um 1
                   ; verringert
[01]  0x3fd  „45“  ; Push Register19
      0x3fc        ; Der vom Prozessor verwaltete Stackpointer wird um 1
                   ; verringert
[02]               ; Der ursprüngliche Inhalt von Register 18 wird
                   , zerstört
[03]               ; Der ursprüngliche Inhalt von Register 19 wird
                   ; zerstört
[04]               ; Irgendetwas
                   ; Der Compiler weis das nun zwei Register restauriert
                   ; werden müssen
      0x3fd        ; Der vom Prozessor verwaltete Stackpointer wird um 1
                   ; erhöht
      0x3fd  „45“  ; Pop Register19
      0x3fe        ; Der vom Prozessor verwaltete Stackpointer wird um 1
                   ; erhöht
      0x3fe  „12“  ; Pop Register18
      0x3ff        ; Der vom Prozessor verwaltete Stackpointer wird um 1
                   ; erhöht
      0x3fe  „11“  ; Neue Programmadresse
[11]  0x3ff        ; Hier weiter unabhängig ob verzweigt wurde oder
                   ; nicht

Wichtig:
Das Erhöhen des Stackpointers NACH einem call- und push-Befehl gehört 
implizit zu den Befehlen. Das verringern des Stackpointers VOR einem 
ret(urn)- und pop-Befehl gehört ebenfalls dazu.
Wie man in dem obigen Beispiel sehen kann, können verschiedene Typen von 
Werten bzw. Variablen auf (hier Adressen und Zwischenwerte) dem Stapel 
abgelegt werden.

Vorteile:
Wie man sehen kann, kann ein späterer Aufruf derselben oder einer 
anderen Unterfunktion, die gleichen Stapeladressen wiederverwenden. 
Weder der Programmierer noch der Compiler müssen wissen welche Adressen 
und welche Variablen abgelegt werden. Das aufgerufene Unterprogramm kann 
seinerseits Unterprogrammaufrufe, eventuell auch bedingte, enthalten. 
Wichtig sind nur drei Sachen:
1. Die Anzahl an Speicherungen muss gleich der Restaurierungen sein.
2. Die Reihenfolge (LiFo) muss eingehalten werden.
3. Die Gesamtzahl an Speicherungen ist begrenzt. Normalerweise werden 
die bekannten Variablen vom Compiler (hier) ab 0x000 abgelegt. Wächst 
der Stapel zu sehr, so kann er die „untersten“ (mit der höchsten 
Adresse) Variablen überschreiben. Vorsicht bei Rekursion und wenig 
Speicher

Unterbrechungen währen ohne diese Struktur fast unmöglich. Der 
Programmablauf muss zu jeder beliebigen Zeit, an jeder beliebigen Stelle 
und in jedem beliebigen Zustand unterbrochen werden können. Dann muss 
die nächste Arbeitsposition (für den Rücksprung) gesichert werden und 
alle, in der Unterbrechungsroutine verwandten oder veränderten Register 
gesichert werden. Nach Beendigung der Unterbrechung können dann die 
Register wieder restauriert werden und das Programm an der 
Unterbrechungsstelle fortgesetzt werden.
Das eigentliche Programm sollte von dieser Unterbrechung nichts 
mitbekommen und keiner der Beteiligten muss sich mit irgendwelchen 
Speicheradressen herumschlagen oder den Zustand des Stapels kennen.

Wetten, dass sich jetzt ein ganzer Haufen Leute meldet, die das viel 
Besser wissen und meinen dass das ganz anders funktioniert, sowie das 
Beispiel ungeeignet ist.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Ein Stack ist zunächst einmal eine reine Datenstruktur. Was damit 
gemacht wird, ist dabei egal. Wo er liegt, ebenfalls. Genauso, was drauf 
liegt.
Rein das LiFo ist wichtig.

In einem µC wird gerne ein Stack für die Speicherung von Sprungquellen 
oder auch für lokale Variablen (auch zur Parameterübergabe an eine 
Funktion) verwendet.

Dabei ist nicht unbedingt definiert, wo er beginnt und in welche 
Richtung er wächst. Es ist aber einfacher, man legt die Basis ans 
Speicherende und lässt ihn nach unten wachsen. Wenn normaler Speicher 
von unten nach oben aufgebaut wird, treffen sie sich daher gerne mal.

Ein Heap ist entweder eine, oft auf Bäumen basierende, Datenstruktur. 
Auch hier ist also erst einmal egal, wo er abgelegt wird und was drin 
ist. Wichtiger Unterschied zum Stack - man kann auf jedes Element 
zugreifen, nicht nur auf das oberste.

Oder ein Heap ist einfach dynamisch verwendbarer Speicher. Das kann nun 
ein fest definierter Speicherbereich sein (RAM eines µC) oder man muss 
diesen erst einmal vom Betriebssysten holen.

In einem Heap kann man wunderbar weitere Heaps (Datenstruktur) oder 
Stacks ablegen.

Christian

von Jobst M. (jobstens-de)


Lesenswert?

Kan asta schrieb:
> Ein Stack ist immer in Hardware umgesetzt, entweder per Zeiger-Register,
> oder halt direkt in Registern. "Softwarestacks" existieren eigentlich
> nur zu Übungs- und Lehrzwecken.

Verdammt, hat mal jemand einen Controller, der mir meine 
Klammerauflösung in Hardware macht? Soll ja nicht zu Übungs- oder 
Lehrzwecken sein ...



Gruß

Jobst

von Penetrant (Gast)


Lesenswert?

Naja, es gibt auch noch eine Datenstruktur, die nennt sich Heap:

    http://de.wikipedia.org/wiki/Heap_%28Datenstruktur%29

von Edson (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Den ganzen Thread kann man löschen.

Damit ginge der Nachwelt sicher nichts Wertvolles verloren...

von (prx) A. K. (prx)


Lesenswert?

Kan asta schrieb:
> Ein Stack ist immer in Hardware umgesetzt, entweder per Zeiger-Register,
> oder halt direkt in Registern. "Softwarestacks" existieren eigentlich
> nur zu Übungs- und Lehrzwecken.

Einige der RISC Prozessoren, wie etwa IBM Power(PC), besitzen in der für 
den Programmierer sichtbaren Architektur keinerlei Hardware-Support für 
einen Stack (der 8-Bit SC/MP auch nicht, aber das ist schon eine Weile 
her). Call/Return erfolgt über ein Register und was der Programmierer 
damit macht ist im Prinzip seine Sache.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.