====== Assembler ======
Der Grossteil der Informationen findest du in den Slides. Unten findest du primär Aufträge und Links.
{{ :gf_informatik:2021_22_assembler_i.pdf |}}
[[https://kantonsschuleromanshorn.sharepoint.com/:p:/s/FSInformatik/Ec-axk2h40FKok8pEbV4Ku4B-J6070APuLhi3usmMW_8yQ?e=cfU1Xe&nav=eyJzSWQiOjI2MywiY0lkIjoxOTA1MzAzMjc2fQ|Slides Branching / Labels]]
===== Little Man Computer =====
[[https://peterhigginson.co.uk/lmc/|Little Man Computer Simulation]]
[[https://peterhigginson.co.uk/lmc/help.html|Little Man Computer Help]]
===== 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.
1. Tippe den Code in den LMC (nicht copy-paste).
1. Schreibe die beiden Zahlen, die du addieren möchtest, am richtigen Ort in den Speicher.
1. Führe das Programm wiederholt aus. Verfolge genau, was wann passiert:
1. Beobachte den Instruktionszyklus.
1. Stelle sicher, dass du alles verstehst.
1. 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)
...
1. Studiere im Manual die **Sprung-Instruktionen** BRA, BRZ, BRP
1. Schreibe Assembler-Code, der einen **Countdown** ausführt (siehe unten):
1. eine Zahl wird eingelesen
1. wiederholen, solange die Zahl >= 0 ist:
1. die Zahl wird ausgeben
1. 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?
++++Lösung:|
0 INP
1 OUT
2 SUB 5 // Subtrahiert 1 (s. DAT-Instruktion)
3 BRP 1 // Springe zurück zu Zeile 1, wenn der Accumulator 0 oder positiv ist.
4 HLT
5 DAT 1 // Schreibt die gewünschte Zahl in den Speicher.
++++
==== Aufgabe 3: Verzweigungen ====
Nun wollen wir einfache **Verzweigungen** (entspricht **if-else**-Statement in Python) 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 verwendet man, ganz ähnlich wie bei Schleifen, die **Sprung-Instruktionen**. Der Unterschied hier ist, dass man nicht zurück sondern nach weiter unten im Code springt.
...
BRP JMP // if accumulator is zero or positive, jump to line marked with JMP
...
JMP ...
...
1. Studiere im Manual die Befehle BRA, BRZ, BRP
1. Schreibe ein Assembler-Programm, in welchem dem man zuerst zwei Zahlen eingeben kann. Von diesen wird das **Maximum** bestimmt und ausgegeben.
++++Lösung:|
++++
==== Aufgaben 4a-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.