Forum: PC-Programmierung Stapelspeicher (i8086 Assembler)


von Hans W. (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Hans W. (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

Hans Wurst schrieb:

> Ist das soweit korrekt?

Nein. Grund s.o.

von Hans W. (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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.

von Hans W. (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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.

von Hans W. (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Hans W. (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Hans W. (Gast)


Lesenswert?

Sorry, aber was wird auch gern als Steuerbus bezeichnet? Meinst du etwa: 
Die Steuersignale gehen über den Steuerbus?

von (prx) A. K. (prx)


Lesenswert?

So isses.

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.