Stapelspeicher (i8086 Assembler)

Gast #2029549
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?
#2029558
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.
#2029568
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.
Gast #2029571
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?
Gast #2029584
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?
Gast #2029607
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?
Gast #2029628
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.
#2029658
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.
Gast #2029666
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?
#2029682
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren