====== Aufgaben B: Erste Programme mit LMC ======
In diesem Aufgabenset wollen wir nun erste Baby Steps mit dem LMC machen und erste, ganz einfache Progrämmchen schreiben. Stelle auch wieder sicher, dass du das Instruction Set zur Hand hast.
[[https://peterhigginson.co.uk/lmc/|Little Man Computer Simulation]]
[[https://peterhigginson.co.uk/lmc/help.html|Little Man Computer Help]]
==== Aufgabe B1: Addition ====
Ziel ist, zwei Zahlen zu addieren.
1) Schreibe dazu mit der Tastatur zwei Zahlen an zwei unterschiedliche Speicheradressen wie im Beispiel unten. Verwende dafür Speicheradressen im hinteren Bereich (Warum? -> später).
Beispiel: Zahlen $30$ und $12$ wurden an Speicheradressen $54$ und $55$ gespeichert. Es ist irrelevant, ob die beiden Adressen direkt beieinander liegen oder nicht.
{{:gf_informatik:lmc_zahlen_im_speicher.png?nolink&200|}}
2) Mit den Befehlen, die du im Aufgabenset A angetroffen hast, solltest du nun in der Lage sein, den zugehörigen Assemblercode zu schreiben. Notiere aber zuerst in Worten einen Plan, wie der Code grob aussehen soll (noch *kein* Assemblercode).
++++Lösung|
Plan:
1. Lade Zahl an der einen Speicheradresse in Akkumulator.
1. Addiere nun Zahl an der anderen Speicheradresse dazu.
++++
3) Schreibe nun den zugehörigen Assemblercode.
**Achtung:** Nachdem du den Code geschrieben hast und "Submit" drückst, wird der Code in den Speicher geschrieben. Dementsprechend werden die Werte, die du bei 1) in den Speicher geschrieben hast, überschrieben und du musst sie neu eintippen.
++++Lösungen|
LDA 54
ADD 55
HLT
Beachte: Ein Programm muss immer mit dem Befehl `HLT` abgeschlossen werden. Damit trennt man den Programmcode von den Daten im Speicher. Auf dies wird in den Slides genauer eingegangen.
++++
4) Führe den Code nun aus: In Codefenster kopieren / Submit / RUN.
*Tipps:*
* Falls es dir zu langsam geht: OPTIONS / Default fast
* Klicke RESET bevor du den Code wieder laufen lässt.
5) Das Resultat sollte jetzt im *Akkumulator* stehen. Schön wäre es, wenn dieses im OUTPUT-Fenster stehen würde. Füge die entsprechende Zeile Code hinzu.
++++Lösungen|
LDA 54
ADD 55
OUT
HLT
++++
6) Zusätzlich soll nun das Resultat an einer freien Stelle im Speicher gespeichert werden. Füge die entsprechende Zeile Code hinzu.
++++Lösungen|
LDA 54
ADD 55
OUT
STA 56
HLT
++++
==== Aufgabe B2: Subtraktion ====
Programm:
1. Die Benutzerin soll nacheinander zwei Zahlen im Input-Feld eingeben können.
1. Die beiden Zahlen werden dann voneinander subtrahiert und zwar (erste Zahl) - (zweite Zahl).
1. Das Resultat wird im Speicher gespeichert und ausgegeben.
Auftrag:
1. Mache einen Programmierplan: Wie kannst du das Programm oben umsetzen? Überlege dir selber, vergleiche dann mit Lösung 1.
1. Schreibe folgendes Programm mit dem LMC:
++++Lösung 1|
1. Zuerst müssen Zahlen eingegeben werden. Mithilfe des Instruction Sets findest du heraus, wie das geht.
1. Die eingegebenen Zahlen müssen im RAM zwischengespeichert werden.
1. Danach ähnlich wie bei Addition:
1. erste Zahl von Speicher einlesen
1. zweite Zahl subtrahieren
1. Resultat speichern und ausgeben.
1. Programm beenden.
Vielleicht fragst du dich, warum man die Zahlen **zwischenspeichern** muss und sie nach der Eingabe nicht direkt einlesen kann? Hier die Antwort: Verwendet man den Input Befehl, wird die Eingabe direkt in den Akkumulator geschrieben. Der vorherige Wert wird also überschrieben. Würde man rechnen (zweite Zahl) - (erste Zahl), so müsste man deshalb nur die erste Zahl zwischenspeichern. Da man die Subtraktion aber anders herum machen möchte, muss man beide zwischenspeichern.
++++
++++Lösung 2|
INP
STA 97
INP
STA 98
LDA 97
SUB 98
OUT
STA 99
HLT
++++