Frage zum POP-H Befehl / DVT03

Hallo,

ich habe eine kurze Frage zum Beispiel bzw. zur Lösung auf Seite 20 von DVT03 (für alle die diese Buch nicht vorliegen haben, unten die Erläuterung bzw. ein kurzer Programmauszug).
In dem besagten Beispiel ist ein CALL UP-Befehl mit dem Stapelzeiger 28F6, der nächste Befehl ist ein POP H und der Stapelzeiger wird mit 28FA angegeben.
Eigentlich wird bei einem POP-Befehl der Stack doch nur um 2 hochgezählt, aus welchem Grund wird es für diesen Fall um vier hochgezählt?

Auszug aus diesem Programm
...
2811 PUSH H <SP> 28F8
2812 CALL UP <SP> 28F6
2815 POP H <SP> 28FA
...

VIELEN DANK im Voraus!

Viele Grüße,
Orcams
 
AW: Frage zum POP-H Befehl / DVT03

Hi Orcams,

-der Ablauf des Programmes ist folgendermasen :

1. Schritt : PUSH H
-> HL-Register werden auf dem Stack gespeichert
-> Stackpointer zeigt auf 28F8 (wo HL abgelegt wurde)

2. Schritt : CALL UP
-> Rücksprungadresse wird auf dem Stack gespeichert
-> Stackpointer zeigt auf 28F6 (wo die Rücksprungadr steht)

3. Schritt : RET (das ist der Rücksprung vom UP)
-> Adresse wird vom Stack gelesen, Stack wird um 2 erhöht
-> Stackpointer zeigt auf 28F8 (wo HL abgelegt wurde)

4. Schritt : POP H
-> HL-Register werden vom Stack gelesen, Stack wird um 2 erhöht
-> Stackpointer zeigt auf 28F6 (so wie es sein soll :D )

Gruss Uwe


P.S.
der Stackpointer würde ohne den Aufruf zu dem Unterprogramm
nach dem POP auch auf 28FA stehen.

also :

2811 PUSH H <SP> 28F8
2812 POP H <SP> 28FA

nochmal Gruss
 
Zuletzt bearbeitet:
AW: Frage zum POP-H Befehl / DVT03

Hallo Uwe!

Prima...vielen Dank für die schnelle und hilfreiche Antwort!

Noch eine kleine Sache ganz kurz:
Beim CALL-Befehl wird der Stackpointer um 2 heruntergezählt und beim RETURN 2 hochgezählt, ist das richtig?
Ich habe da momantan unterschiedliche Angaben und möchte damit auf jeden Fall hunderprozent richtig informiert sein. Aber ich denke, so wie ich es oben beschrieben habe sollte es richtig sein.

Nochmals vielen Dank für die Hilfe! :)

Grüße,
Orcams
 
AW: Frage zum POP-H Befehl / DVT03

Hi nochmal,

-deine Angaben sind richtig

-der Stack an sich wird bei jedem PUSH oder CALL
größer aber die Adressen werden rückwärts gezählt.

-er startet meißt am Speicherende z.B. 7FFF
und wächst dann in Richtung des Speicheranfangs

-mit jedem POP oder RETURN geht der Adresszeiger
dann wieder hoch

-probleme gibt es dann, wenn der Stack in
schon benutzte Speicherberreiche hinneinkommt
(wenn man zu viele Unterprogramme hat :rolleyes: )

Gruss Uwe
 
AW: Frage zum POP-H Befehl / DVT03

VIELEN DANK noch mal für die ausführliche Erläuterung!! :)

Viele Grüße,
Orcams
 
AW: Frage zum POP-H Befehl / DVT03

Hey!


Kleine Anmerkung meinerseits:

Wenn das RAM von 7000-7FFF geht, wird der Stackpointer auf 8000 initialisiert; nicht auf 7FFF.

Begründung (Ablauf bei Call XXXXh):
-Stackpointer um 1 dekrementieren
-1. Nibble der Rücksprungadresse speichern
-Stackpointer um 1 dekrementieren
-2. Nibble der Rücksprungadresse speichern

Da dies der Ablauf ist, wäre ein Byte des Stacks verloren, würde man den Pointer auf 7FFF initialisieren.


Dies mag jetzt knausrig klingen, ist aber (ich berichte aus Erfahrung) ein Bestandteil der Staatlichen.


Grüße an die Füße, 8)
Christian
 
AW: Frage zum POP-H Befehl / DVT03

@Christian,

-vielleicht hat mein STACK den Adressberreich bis 7FFEh
dann würd's wieder passen :D :D

...hast natürlich recht...

Gruss Uwe
 
Top