**Dies ist eine alte Version des Dokuments!**
Assembler
Der Grossteil der Informationen findest du in den Slides. Unten findest du primär Aufträge und Links.
Little Man Computer
Instruction Set
Code | Name | Description |
---|---|---|
0 | HLT | Stop (Little Man has a rest). |
1 | ADD | Add the contents of the memory address to the Accumulator |
2 | SUB | Subtract the contents of the memory address from the Accumulator |
3 | STA or STO | Store the value in the Accumulator in the memory address given. |
4 | This code is unused and gives an error. | |
5 | LDA | Load the Accumulator with the contents of the memory address given |
6 | BRA | Branch - use the address given as the address of the next instruction |
7 | BRZ | Branch to the address given if the Accumulator is zero |
8 | BRP | Branch to the address given if the Accumulator is zero or positive |
9 | INP or OUT | Input or Output. Take from Input if address is 1, copy to Output if address is 2. |
9 | OTC | Output accumulator as a character if address is 22. (Non-standard instruction) |
9 | DAT | Used to indicate a location that contains data. |
Aufgaben
Aufgabe 1
Betrachte das einfache Assemblerprogramm, welches zwei Zahlen, welche im Code gespeichert sind, addiert:
LDA 97 ADD 98 STA 99 OUT HLT
Arbeite in 2er-Gruppe.
- Tippe den Code in den LMC (nicht copy-paste).
- Schreibe die beiden Zahlen, die du addieren möchtest, am richtigen Ort in den Speicher.
- Führe das Programm wiederholt aus. Verfolge genau, was wann passiert:
- Beobachte den Instruktionszyklus.
- Stelle sicher, dass du alles verstehst.
- Schreibe den Code so um, dass nun vier Zahlen addiert werden können.
Aufgabe 2: Schleifen
Nun wollen wir Schleifen (ähnlich wie while in Python) in Assembler programmieren. Bei einer solchen wird eine Bedingung überprüft. Je nachdem, ob diese erfüllt ist, springt der Code dann wieder zurück. Dazu verwenden wir die Sprung-Instruktionen (Branch) in Assembler.
... LOOP ... // here loop starts ... BRP LOOP // if accumulator is >= 0, jump to LOOP (can also use different name) ...
- Studiere im Manual die Sprung-Instruktionen BRA, BRZ, BRP
- Schreibe Assembler-Code, der einen Countdown ausführt (siehe unten).
Countdown:
- eine Zahl wird eingelesen
- wiederholen, solange die Zahl >= 0 ist:
- die Zahl wird ausgeben
- die Zahl wird um 1 verringert
Hinweise:
- Mit
ONE DAT 1
kann nach dem eigentlichen Programm eine Zahl (z.B. $1$) in den Speicher geschrieben werden, die dann für die Subtraktion verwendet werden kann. - Welche Sprung-Instruktion musst du hier verwenden?
Aufgabe 3: Verzweigungen
Nun wollen wir ein einfaches if-else-Statement in Assembler programmieren. Bei einem solchen wird eine Bedingung überprüft. Je nachdem, ob diese erfüllt ist, springt der Code dann an eine andere Stelle. Dazu verwenden wir die Branch-Elemente in Assembler. Mit diesen kann der aktuelle Wert im Accumulator überprüft werden und man kann an eine bestimmte Stelle springen.
... BRP JMP // if accumulator is zero or positive, jump to line marked with JMP ... JMP ... ...
- Studiere im Manual die Befehle BRA, BRZ, BRP
- Schreibe ein Assembler-Programm, in welchem dem man zuerst zwei Zahlen eingeben kann. Von diesen wird das Maximum bestimmt und ausgegeben.
Aufgaben 3a-f
Löse eine der folgenden Aufgaben; verwende Labels und Branching Instructions.
- Eine Zahl einlesen, mit -1 multiplizieren und ausgeben.
- Countdown: alle Zahlen von der Eingabe bis 0 ausgeben (mit Labels)
- Fibonacci-Zahl für die Eingabe berechnen und ausgeben.
- Zwei Zahlen einlesen, das Produkt ausgeben.
- (Optional) Funktioniert die Lösung auch mit negativen Zahlen?
- Ganzzahldivision
- (* Schwierig *) Schreiben Sie einen Bootloader: Dieser liest ein anderes Programm vom Input und schreibt es in den Speicher. Wenn eine 000 (HALT) gelesen wird, soll das eingelesene Programm ausgeführt werden.