Übungsstunde: Erstes Assembler Programm für einen Prozessor
In dieser Übungsstunde haben wir unser erstes Programm für einen Prozessor geschrieben. Der Prozessor ist fiktiv. Das Programm lässt sich so nicht 1:1 auf einen echten Prozessor übertragen.
Assembler ist einer der untersten Programmiersprachen. Also eine, die am nächsten an der Maschine arbeiten.
Unser erstes Prozessorprogramm in Assembler. Dazu gibt es im ersten Sinne folgende Befehle:
LOAD <Speicherzelle> STORE <Speicherzelle> ADD <Speicherzelle> SUB <Speicherzelle> JUMP <Label> JUMPZ <Label> LOADA // Lesen der ausgerechneten Speicherzelle
Wir haben die obrigen Befehle zur Verfügung. Dazu gilt es nun folgende Aufgaben zu lösen:
1. Schreiben Sie ein Programm (ohne Schleife), das die Inhalte der Speicherzellen 1-4 addiert und das Ergebnis in Speicherstelle 5 ablegt.
Load 1; Add 2; Add 3; Add 4; Store 5;
2. … Speicherzelle 1 sagt wie viele Speicherzellen nachfolgend addiert werden sollen.
LOAD 3; // Laden der SZ 3 JUMPZ FERTIG; // Wenn SZ == 0; Ende SUB 1; // Subtrahieren der SZ 1 STORE 3; // Speichern in SZ 3 ADD 2; // Laden der SZ 2 LOADA; // Adresse des momentan Speichers lesen ADD 4; // Addieren der SZ 4 (Inhalt == Zwischensumme) STORE 4; // Speichern in SZ 4 JUMP LOOP; // Wieder zum Anfang springen
SZ = Speicherzelle
Die nächste Tabelle zeigt die Einteilung der Speicherzellen mit ihrem Inhalt, um den letzten Teil des Codes besser verstehen zu können.
Speicherzelle | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Inhalt | 0 | 1 | 4 | ‚ | Zwischensumme | n | x1 | x2 | x3 |
Hiermit haben wir unsere erste Schleife in Assembler realisiert.
Leider geht bei diesem Programm unsere Speicherzelle 5 kaputt. Deswegen erweitern wir unser Programm darum, das wir uns eine Kopie von 5 anlegen und damit weiterarbeiten. Dadurch wird die Speicherzelle 5 nicht überschrieben und wir können diese beliebig oft verwenden.
LOAD 5 STORE 3 // Kopie von "n" (SZ 5) anlegen LOAD 0 STORE 4 // Summe auf 0 zurücksetzen LOAD 3 // Laden der SZ 3 JUMPZ FERTIG // Wenn SZ == 0; Ende SUB 1 // Subtrahieren der SZ 1 STORE 3 // Speichern in SZ 3 ADD 2 // Laden der SZ 2 LOADA // Adresse des momentan Speichers lesen ADD 4 // Addieren der SZ 4 (Inhalt == Zwischensumme) STORE 4 // Speichern in SZ 4 JUMP LOOP // Wieder zum Anfang springen FERTIG LOAD 5 ADD 2 ADD 1 STOREAR LOAD 4 STORE
Speicherzelle | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Inhalt | 0 | 1 | 4 | Kopie von n (SZ 5) | Zwischensumme | n | x1 | x2 | x3 |
An dieser Stelle benötigen wie ein Adressregister und fügen somit folgende Befehle an:
STOREAR //Speichern in Adressregister LOADAR // Laden aus Adressregister STORE <Ohne Angaben> LOAD <Ohne Angaben>
Mit diesen Befehlen lässt sich nun der komplett geforderte Code realisieren. Dies ist die Grundfunktionsweise eines Prozessors und der Programmiersprache Assembler, die dafür verwendet wird, Maschinen zu Programmieren.