Stack Operationen bei Interrupts, CALL- und RETURN sowie bei PUSH- und POP-Befehlen history menue Letztmalig dran rumgefummelt: 09.03.07 18:51:39
Eines ist allen drei Befehlsgruppen, welche in sich höchst unterschiedlich wirken, gemeinsam: sie nutzen den Stack - also einen externen RAM-Bereich als Merkzellen für Operanden. Zudem tun sie dies automatisch, also ohne Beeinflussung durch den Programmierer. Da sich aber die Arbeitsweise des Stackpointers schon besonders gestaltet, hier einige Anmerkungen zur Verfahrenstechnik
  1. CALL-Befehl
  2. RETURN-Befehl
  3. INT-Auslösung
  4. RETN-Befehl
  5. PUSH-Befehl
  6. POP-Befehl
  • der Stack ist ein RAM-Bereich, welcher nach unten wächst
  • folgerichtig sollte er im RAM weit oben liegen
  • selbstverständlich ist dieser Bereich für den Programmierer bzw. das OS tabu
 

1. CALL-Befehl history menue scroll up
Subroutinen machen sich genau dann extrem nützlich (dies gilt besonders auf der Maschinenebene, wo bekanntermaßen wenig Speicherplatz verfügbar ist), wenn ein und dieselbe Operation evtl. mit verschiedenen Parametern durchgeführt werden soll. Zur Ablage der Rückkehradresse nutzen Subroutinen den Stackbereich im RAM. Zu beachten ist, dass der PC erst den CALL-Befehl vollständig einlesen muss, also der Programmcounter intern schon entsprechend weiter geschalten wurde, erst dieser Wert +1 wird anschließend auf den Stack geschrieben.
 

2. RETURN-Befehl history menue scroll up
Bei Rücksprung aus einem Unterprogramm ist der Programmcounter auf Werte eingestellt, welche durch die Subroutine genutzt wurden. Zur Rückkehr muss er wieder auf den Wert gestellt werden, welcher vor Aufruf der Routine +1gestellt war.
 

3. INT-Auslösung history menue scroll up

Bei Rücksprung aus einem Unterprogramm ist der Programmcounter auf Werte eingestellt, welche durch die Subroutine genutzt wurden. Zur Rückkehr muss er wieder auf den Wert gestellt werden, welcher vor Aufruf der Routine +1gestellt war.
 


4. RETN-Befehl history menue scroll up

Bei Rücksprung aus einem Unterprogramm ist der Programmcounter auf Werte eingestellt, welche durch die Subroutine genutzt wurden. Zur Rückkehr muss er wieder auf den Wert gestellt werden, welcher vor Aufruf der Routine +1gestellt war.
 


5. PUSH-Befehle history menue scroll up
Bevor Subroutinen und/oder Interruptservice-Routinen angesprungen werden können, müssen evtl. Registerinhalte gerettet werden. Diese Merkzettel für den Computer liegen im RAM und werden durch den Stackpointer verwaltet. Dabei wird nach Abarbeitung des PUSH-Befehls zuerst der Stackpinter automatisch um 1 verringert, erst dach werden die beiden Operationen zum Schreiben von jeweils 8 Bit auf den RAM durchgeführt. Selbstverständlich wir dazwischen wiederum automatisch der SP um ein verkleinert.
wie immer arbeitet der Stack als LIFO-Speicher - was zuletzt abgelegt wurde, muss auch garantiert auch als erstes abgeholt werden
 

das Prinzip stimmt, jedoch mit Arbeitsstand 8.3.07 vorsichtig verwenden - Ausarbeitung extrem Fehleranfällig ;-)

Rechnersystem bei Eintreffen des PUSH AF-Befehls

  • SP steht auf 5A46H
  • PC steht auf 2398H
  • der Inhalt des Doppelregisters AF wird in den Kellerspeicher gebracht, wobei der niederwertige - also Register F in die RAM-Zelle (SP-1), der höherwertige - also Register A in die Zelle (SP-2) geschrieben werden wird

Rechnersystem nach Ausführung des PUSH AF-Befehls

  • SP steht auf 5A44H
  • PC steht auf 2399H
  • der Inhalt des Registers F wurde auf Adresse 5A45H kopiert
  • der Inhalt des Registers A wurde auf Adresse 5A44H kopiert
  • die Inhalte der Register AF sind noch verfügbar

Rechnersystem bei Eintreffen des PUSH BC-Befehls sowie nach Ausführung von PUSH AF

  • SP steht auf 5A44H
  • PC steht auf 2399H
  • der Inhalt des Doppelregisters BC wird in den Kellerspeicher gebracht, wobei der niederwertige - also Register C in die RAM-Zelle (SP-1), der höherwertige - also Register BA in die Zelle (SP-2) geschrieben werden wird

Rechnersystem nach Ausführung des PUSH AF und PUSH BC-Befehls

  • SP steht auf 5A42H
  • PC steht auf 239AH
  • der Inhalt des Registers C wurde auf Adresse 5A41H kopiert
  • der Inhalt des Registers B wurde auf Adresse 5A40H kopiert
  • die Inhalte der Register BC sind noch verfügbar

Rechnersystem bei Eintreffen des PUSH DE-Befehls  sowie nach Ausführung des PUSH AF und PUSH BC-Befehls

  • SP steht auf 5A40H
  • PC steht auf 239AH
  • der Inhalt des Doppelregisters DE wird in den Kellerspeicher gebracht, wobei der niederwertige - also Register E in die RAM-Zelle (SP-1), der höherwertige - also Register D in die Zelle (SP-2) geschrieben werden wird

Rechnersystem nach Ausführung des PUSH AF,  PUSH BC- und PUSH DE-Befehls

  • SP steht auf 5A3EH
  • PC steht auf 239BH
  • der Inhalt des Registers E wurde auf Adresse 5A3FH kopiert
  • der Inhalt des Registers D wurde auf Adresse 5A3EH kopiert
  • die Inhalte der Register DE sind noch verfügbar

Rechnersystem bei Eintreffen des PUSH HL-Befehls  sowie nach Ausführung des PUSH AF, PUSH BC  und PUSH DE-Befehls

  • SP steht auf 5A3EH
  • PC steht auf 239BH
  • der Inhalt des Doppelregisters HL wird in den Kellerspeicher gebracht, wobei der niederwertige - also Register L in die RAM-Zelle (SP-1), der höherwertige - also Register H in die Zelle (SP-2) geschrieben werden wird

Rechnersystem nach Ausführung des PUSH AF,  PUSH BC, PUSH DE und PUSH HL-Befehls

  • SP steht auf 5A3CH
  • PC steht auf 239CH
  • der Inhalt des Registers E wurde auf Adresse 5A3DH kopiert
  • der Inhalt des Registers D wurde auf Adresse 5A3CH kopiert
  • die Inhalte der Register DE sind noch verfügbar

Rechnersystem bei Eintreffen des PUSH IX-Befehls  sowie nach Ausführung des PUSH AF, PUSH BC, PUSH DE  und PUSH HL-Befehls

  • SP steht auf 5A1EH
  • PC steht auf 239CH
  • der Inhalt des Indexregisters IX wird in den Kellerspeicher gebracht, wobei der niederwertige - in die RAM-Zelle (SP-1), der höherwertige - in die Zelle (SP-2) geschrieben werden wird

Rechnersystem nach Ausführung des PUSH AF,  PUSH BC, PUSH DE, PUSH HL und PUSH IX-Befehls

  • SP steht auf 5A1CH
  • PC steht auf 239EH (der PUSH-Befehl für die Indexregister ist zwei Byte lang)
  • der niederwertige Inhalt des Registers IX wurde auf Adresse 5A1DH kopiert
  • der höherwertige Inhalt des Registers IX wurde auf Adresse 5A3CH kopiert
  • die Inhalte der Register DE sind noch verfügbar

Rechnersystem bei Eintreffen PUSH IY-Befehls sowie nach Ausführung  des PUSH AF,  PUSH BC, PUSH DE, PUSH HL und PUSH IX-Befehls

  • SP steht auf 5A1EH
  • PC steht auf 239EH
  • der Inhalt des Indexregisters IY wird in den Kellerspeicher gebracht, wobei der niederwertige - in die RAM-Zelle (SP-1), der höherwertige - in die Zelle (SP-2) geschrieben werden wird

Rechnersystem nach Ausführung des PUSH AF,  PUSH BC, PUSH DE, PUSH HL, PUSH IX sowie PUSH IY-Befehls

  • SP steht auf 5A1CH
  • PC steht auf 239EH (der PUSH-Befehl für die Indexregister ist zwei Byte lang)
  • der niederwertige Inhalt des Registers IX wurde auf Adresse 5A1DH kopiert
  • der höherwertige Inhalt des Registers IX wurde auf Adresse 5A3CH kopiert
  • die Inhalte der Register DE sind noch verfügbar

6. POP-Befehle history menue scroll up

Nachdem Subroutinen und/oder Interruptservice-Routinen ausgeführt wurden, müssen evtl. Registerinhalte wieder auf die vorherigen Werte eingestellt werden. Die Ablage selbiger bfindet sich im RAM und wurde vorab durch entsprechende PUSH-Befehle auf den Stack geschrieben - durch den Stackpointer verwaltet. Dabei wird nach Abarbeitung des POP-Befehls zuerst der Stackpinter automatisch um 1 erhöht, erst dach werden die beiden Operationen zum Lesen von jeweils 8 Bit auf den RAM durchgeführt und die Inhalte in die entsprechenden Register eingetragen. Selbstverständlich wir dazwischen wiederum automatisch der SP um ein erhöht.
 



zur Hauptseite
© Samuel-von-Pufendorf-Gymnasium Flöha © Frank Rost im März 2003

... dieser Text wurde nach den Regeln irgendeiner Rechtschreibreform verfasst - ich hab' irgendwann einmal beschlossen, an diesem Zirkus nicht mehr teilzunehmen ;-)

„Dieses Land braucht eine Steuerreform, dieses Land braucht eine Rentenreform - wir schreiben Schiffahrt mit drei „f“!“

Diddi Hallervorden, dt. Komiker und Kabarettist