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