Jahrgangsstufe Q2 - Informatik - Donnerstag, der 11. März 2021


Mein Name:
Jahrgang/Klasse:
Meine E-Mail-Adresse:

Arbeitsmaterial:

Rechnerinterne Vorgänge:

Informationen

Das kleine Programm mit der Berechnung von z = x + y begann in der ersten Zeile so:

0 JMP 5
  ...

Führt man den Einzelschrittmodus für den ersten Befehl 0 JMP 5 aus, ergibt sich folgender Ablauf:

Kurzform Beschreibung
PC --> AR Der Program-Counter PC (hier 0) wird über den Adressbus AB in das Adressregister AR geladen.
rd (read) Der Inhalt der Speicherstelle mit der AR-Nummer (hier 0) wird in das Datenregister DR gelesen (hier 516= 000100 0000100).
PC = PC + 1 Der PC wird um 1 erhöht (hier nun 1).
DR --> IR Der Inhalt des Datenregisters DR (516) wird über den Datenbus zum Instruction-Register IR (hier: 000100 0000100) transportiert.
Adr.(IR) --> PC    Der Adressanteil im IR (0000100=4) wird zum PC (nun 0000100=4) transferiert.

Zu Beginn des Programmlaufs ist im PC der Wert 0 gespeichert. Dies kann man auch später nach einem Programmlauf mit der Eingabe PC 0 wiederherstellen. Nach der Ausführung des Befehls JMP 5 ist im PC nunmehr der Wert 5 gespeichert, weil an der Speicheradresse 5 der nächste auszuführende Befehl steht (hier: LDA 1). Im PC steht also immer die Speicheradresse, an der es im Programmablauf weitergeht. Im Normalfall wird nach jedem Befehl der PC um 1 erhöht, damit es an der darauffolgenden Adresse weitergeht. Durch gezielte Modifikationen am PC sind allerdings auch die von der höheren Programmiersprache Java bekannten Programm-Ablaufstrukturen wie Schleifen und Verzweigungen möglich. Dies wird im folgenden Beispiel demonstriert, bei dem mit einer do-while-Schleife die Zahlen von 1 bis 10 absteigend ausgegeben werden. Als Kommentar (hinter einem Semikolon) ist eine Art von Mini-Java angegeben.

        JMP Anfang
k       DEF 0             ; int k = 0
zehn    DEF 10            ; int zehn = 10
Anfang
         LDA zehn
         STA k            ; k = 10
Schleife                  ; do {
         LDA k
         OUT k            ;      print (k)
         DEC
         STA k            ;      k = k-1
         JPL Schleife     ; } while (k > 0)
         END

Neu ist der Befehl JPL: Jump if PLus.
Wenn der Akkuinhalt positiv ist, geht die Ausführung des Programmes an der Stelle Schleife weiter, d.h. am Beginn der do-while-Schleife. Der Java-Compiler übersetzt also die erste öffnende geschweifte Klammer in eine Sprungmarke und die zweite schließende geschweifte Klammer zusammen mit der while-Bedingung in einen bedingten Sprung.

Hier ist eine Liste der möglichen Sprungbefehle:

Befehl Bedeutung
JMP JUMP --- Unbedingter Sprung. Springe zur angegeb. Speicherstelle und fahre mit dem dort stehenden Befehl fort.
JMS JUMP IF MINUS --- Springe zur angegeb. Speicherstelle und fahre mit dem dort stehenden Befehl fort, wenn der Akkuinhalt negativ ist. Wenn nicht, dann fahre mit dem nächsten Befehl fort.
JPL JUMP IF PLUS --- Sprung, wenn Akkuinhalt > 0.
JZE JUMP IF ZERO --- Sprung, wenn Akkuinhalt = 0.
JNM JUMP IF NOT MINUS --- Sprung, wenn Akkuinhalt >= 0.
JNP JUMP IF NOT PLUS --- Sprung, wenn Akkuinhalt <= 0.
JNZ JUMP IF NOT ZERO --- Sprung, wenn Akkuinhalt <> 0.

Auftrag 1:

Speichere das angegebene Beispiel in einer Datei DoWhile.DCL, übersetze das Programm mit dem Assembler im DC in die Datei DoWhile.DC, lade die Datei DoWhile.DC in den DC und starte das Programm mit R.

Auftrag 2:

Die Zahlen sollen nun ebenfalls absteigend ausgegeben werden, aber nun mit einer normalen while-Schleife, bei der die Bedingung am Anfang der Schleife steht.
Überlege dir zuerst, wie das im obigen Beispiel als Kommentar angegebene Mini-Java-Programm umgeschrieben werden müsste und übersetze es dann in ein DCL-Programm mit geeigneten Sprungmarken und -Befehlen. Übersetze dann dein DCL-Programm mit dem Assembler in ein DC-Programm und teste den fehlerfreien Ablauf im DC.
Gib dann wie im obigen Beispiel den DCL-Code inklusive der Mini-Java-Kommentare hier im Formular ein.