===== 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.​