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.
Also versteht sich das so: Meine Befehle: MOV AX,1 PUSH AX Der Stack vor den Befehlen: | | | | | | | | | | | 5 | <- SP (SS:SP) |-----| <- Segementende Der Stack bevor der Wert vom Register kommt: | | | | | | | | | | <- SP + 2 (SS:SP) | 5 | |-----| <- Segementende Der Stack nachdem der Wert geschrieben wurde: | | | | | | | | | 1 | <- SP+2 (SS:SP) | 5 | |-----| <- Segementende Ist das soweit korrekt?
Meine Befehle: MOV AX,1 PUSH AX Der Stack vor den Befehlen: | | | | | | | | | | | 5 | <- SP (SS:SP) |-----| <- Segementende Der Stack bevor der Wert vom Register kommt: | | | | | | | | | | <- SP -2 (SS:SP) | 5 | |-----| <- Segementende Der Stack nachdem der Wert geschrieben wurde: | | | | | | | | | 1 | <- SP-2 (SS:SP) | 5 | |-----| <- Segementende Stimmts jetzt?
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.
Sorry, aber was wird auch gern als Steuerbus bezeichnet? Meinst du etwa: Die Steuersignale gehen über den Steuerbus?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.