Hallo!
Ich habe eine Frage:
Ich soll mir Grundlagen zum Stack aneignen. Ich bin da jetzt schon mal
soweit gekommen, dass der Stack kurzzeitiger Arbeitsspeicher mit einer
max. Größe von 64kB. Der Stack wird zur kurzzeitige Speicherung von
Daten benötigt, wie z.B. der Rücksprungadresse für den Rücksprung aus
einem Unterprogramm. Auch der Programmierer selbst kann ihn nutzen z.B
zum Speichern von später wieder benötigten Parametern. Die physikalische
Adresse wird durch das Register SS:SP berechnet bzw. angegeben. Der
Stack arbeitet nach dem LIFO-Prinzip.
Dann gibt es noch den Stackpointer, der zu jeder Zeit auf das aktuelle
Element im Stack zeigt und Automatisch umd eins erhöhrt oder erniedrigt
wird.
Nun meine Frage:
Wenn ich nun einen Wert auf den Stack "pushe", dann muss doch vorher der
Stackpointer um 1 erhöht werden, damit der Assembler weiß an welche
Stelle er den neuen Wert schreiben muss, nicht wahr? Genauso beim
"popen". Wenn ich den Wert also wieder runterholen will, dann muss ich
von der akutellen Position (da liegt ja das gerade raufgepushte Element)
das Element runterholen und vom Stack löschen und danach wird der
Stackpointer vom Assembler automatisch um 1 erniedrigt wodurch der
Stackpointer wieder auf das oberste Element zeigt, nicht wahr?
Ist das soweit alles korrekt?
Hans Wurst schrieb:> zum Speichern von später wieder benötigten Parametern. Die physikalische> Adresse wird durch das Register SS:SP berechnet bzw. angegeben. Der> Stack arbeitet nach dem LIFO-Prinzip.>> Dann gibt es noch den Stackpointer,
SS:SP ist der Stackpointer.
> Wenn ich nun einen Wert auf den Stack "pushe", dann muss doch vorher der> Stackpointer um 1 erhöht werden,
Bei fast allen Architekturen wächst der Stack abwärts. Also wird
dekrementiert, und zwar bei x86 vorher, und um 2 weil Wort statt Byte.
> damit der Assembler weiß an welche> Stelle er den neuen Wert schreiben muss, nicht wahr?
Dem Assembler ist das schnurz. Das interessiert die Maschine, nicht das
Programm was deinen Quellcode in Maschinencode umsetzt.
Hans Wurst schrieb:> Wenn ich nun einen Wert auf den Stack "pushe", dann muss doch vorher der> Stackpointer um 1 erhöht werden, damit der Assembler weiß an welche> Stelle er den neuen Wert schreiben muss, nicht wahr?
Das macht aber alles der Befehl 'Push'. Sonst wär der nämlich ziemlich
sinnlos, wenn man sich selbst um den Stackpointer kümmern muss.
> Genauso beim> "popen".
Auch dort musst du dich nicht um den Stackpointer kümmern.
Yep.
Zur Darstellung: Zwar wachsen von Informatikern gepflegte Bäume von der
Wurzel oben zu den Blättern unten - aber für gewöhnlich ist bei Stacks
dennoch oben oben und unten unten und nicht andersrum.
Danke für deine Hilfe!
Ich hab noch eine Frage:
In einem Prozessor wie z.B. dem i8086 von Intel kann man ja
mit Hilfe des Assemblers eine direkte Adressierung machen. Diese direkte
Adressierung sieht z.B. so aus: mov AX,variable, wobei "variable" im
Datensegment vereinbart wurde.
Vom Assembler her betrachtet passiert ja da folgendes:
Der Wert der im Datensegemtn unter "variable" abgelegt wurde, wird über
den Datenbus in den Akkumulator gespeichert. Soweit ja richtig. Nur, was
passiert da im Rechner selber? Ich will das jetzt nicht auf der
physikalischen Ebene betrachten, sondern viel mehr auf der weit
verbreiteten und etwas abstrahierteren Ebene des Von-Neumann-Rechners
betrachten. Ich werde das jetzt mal versuchen.
Im Befehlswort steht die Adresse der Variablen im Speicher. Das
Steuerwerk schaltet laut Befehl die Speicherstelle mit dem Wert auf den
Datenbus und und weißt das Register, also den Akkumulator, an, den Wert
zu speichern.
Ist meine Erklärung dazu richtig?
Hans Wurst schrieb:> Vom Assembler her betrachtet passiert ja da folgendes:
Schon falsch, denn der Assembler ist das Programm, was aus deinem
Quelltext die Maschinensprache macht. Was du meinst ist, was der
Prozessor macht.
> Ist meine Erklärung dazu richtig?
Etwas abstrahiert betrachtet: ja, fast. Du solltest den Adressbus nicht
vergessen.
Was für eine aufgabe übernimmt dann der Adressbus? Ich habs mal so
versucht:
Vom Prozessor her betrachtet passiert ja da folgendes:
Der Wert der im Datensegemnt unter "variable" abgelegt wurde, wird über
den Datenbus in den Akkumulator gespeichert. Soweit ja richtig. Nur, was
passiert da im Rechner selber? Ich will das jetzt nicht auf der
physikalischen Ebene betrachten, sondern viel mehr auf der weit
verbreiteten und etwas abstrahierteren Ebene des Von-Neumann-Rechners
betrachten. Ich werde das jetzt mal versuchen.
Im Befehlswort steht die Adresse der Variablen im Speicher. Das
Steuerwerk schaltet laut Befehl die Adresse der Speicherstelle (hier ja
"variable") mit dem Wert auf den Adressbus. Diese Adresse kommt darüber
am Speicher an welcher auf Grund der Adresse die richtige Speicherzelle
sucht und den Wert über den Datenbus an Zielregister schickt. Die
Steuersignale des Steuerwerks weißen das Ziel-Register, also den
Akkumulator an, den Wert zu speichern welcher über den Datenbus vom
Speicher zum Register verschickt wurde.
Hans Wurst schrieb:> Im Befehlswort steht die Adresse der Variablen im Speicher. Das> Steuerwerk schaltet laut Befehl die Adresse der Speicherstelle (hier ja> "variable") mit dem Wert auf den Adressbus. Diese Adresse kommt darüber> am Speicher an welcher auf Grund der Adresse die richtige Speicherzelle> sucht und den Wert über den Datenbus an Zielregister schickt. Die> Steuersignale des Steuerwerks weißen das Ziel-Register, also den> Akkumulator an, den Wert zu speichern welcher über den Datenbus vom> Speicher zum Register verschickt wurde.
Jetzt hast du es fast.
Woher weiß der Speicher, was er mit der Adresse machen muss?
Es gibt ja 2 Möglichkeiten
* entweder der Speicher soll den unter dieser Adresse gespeicherten
Wert auf den Datenbus legen
* oder der Speicher soll den auf dem Datenbus anliegenden Wert unter
dieser Adresse im Speicher speichern.
Naja im Fall MOV AX,variable soll der Speicher den unter der Adresse
liegenden Wert auf den Datenbus legen.
Woher der Speicher nun wissen soll, was er mit der anstehenden Adresse
machen soll weiß ich nicht so genau. Sind es auch Steuersignale die vom
Steuerwerk ausgehen?
Hans Wurst schrieb:> Naja im Fall MOV AX,variable soll der Speicher den unter der Adresse> liegenden Wert auf den Datenbus legen.
Das weiß die CPU.
Aber woher weiß es der Speicher?
> Woher der Speicher nun wissen soll, was er mit der anstehenden Adresse> machen soll weiß ich nicht so genau. Sind es auch Steuersignale die vom> Steuerwerk ausgehen?
Bingo
Datenbus
Adressbus
Steuerbus
Hans Wurst schrieb:> Woher der Speicher nun wissen soll, was er mit der anstehenden Adresse> machen soll weiß ich nicht so genau. Sind es auch Steuersignale die vom> Steuerwerk ausgehen?
Yep, wird gern auch als Steuerbus bezeichnet.