===== Aufgaben C =====
==== 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 ====
Schreibe Assembler-Code, der einen Countdown ausführt:
* eine Zahl wird eingelesen
* wiederholen, solange die Zahl >= 0 ist:
* die Zahl wird ausgeben
* die Zahl wird um 1 verringert
Hinweise:
* mit `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.
* die Wiederholung benötigt eine Sprung-Instruktion (Branch, Instruktionen 6-8) - welcher ist der richtige?
++++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.
++++
==== 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 ***) Schreibe 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.