Appearance
Assembler
Assemblersprache
Beim vorhergehenden Beispiel wurden die Instruktionen direkt in die Speicherstellen eingegeben. Diese Art zu programmieren ist aber sehr mühsam. Deshalb wurden Assemblersprachen entwickelt.
In einer Assemblersprache werden die Instruktionen durch Text dargestellt. Häufig wird eine Instruktion durch drei Buchstaben gekennzeichnet.
Mit einem Assembler wird dieser Programmcode in die eigentlichen Instruktionen übersetzt.
Im LMC kann im linken Fenster Assemblercode geschrieben werden. Mit Assemble into RAM wird der Assemblercode in die Instruktionen übersetzt und in den Speicher übertragen.
Dabei wird jede Zeile des Assemblerprogramms in eine entsprechende dreistellige Zahl übersetzt und in die jeweils nächste Speicherstelle geschrieben.
Addition mit Assembler
Klicken Sie auf OPTIONS und wählen Sie clear memory aus.
Klicken Sie in das linke Textfeld.
Kopieren Sie diesen Code in das Textfeld und klicken Sie auf Submit:
asmINP STA 12 INP ADD 12 OUT HLTKlicken Sie auf Assemble into RAM
Vergleichen Sie den Inhalt des Speichers mit der ersten Aufgabe.
Was ist gleich, was ist anders?
Was ist die Bedeutung der Zahl 12?
Was passiert, wenn 12 durch 4 ersetzt wird?
Labels und Daten
Die explizite Verwendung von Speicheradressen ist umständlich und fehleranfällig. Deshalb kann im Assembler jede Speicherstelle mit einem Label versehen werden. Dazu wird vor dem Befehl ein beliebiges Wort aus ASCII-Buchstaben geschrieben. Dieses Label kann im Code anstelle einer Speicheradresse verwendet werden.
Zusätzlich gibt es den Pseudobefehl DAT, welcher eine Speicherstelle für einen Datenwert reserviert.
Das folgende Beispiel zeigt nochmals das Programm, welches zwei Zahlen addiert:
asm
INP
STA zahl
INP
ADD zahl
OUT
HLT
zahl DAT 0Die Zeile zahl DAT 0 reserviert eine Speicherstelle für Daten und initialisiert sie mit dem Wert 0. Die Instruktionen STA und ADD verwenden das Label zahl anstelle der fixen Speicheradresse.
Daten müssen immer nach der HLT-Instruktion stehen. Ansonsten wird deren Inhalt während des Programmablaufs als Instruktion interpretiert und ausgeführt.
Addition mit Label
- Geben Sie den oben stehenden Code ein und assemblieren Sie ihn.
- Führen Sie das Programm aus.
- Welche Speicherstelle wird für die
zahlverwendet?
Verzweigungen
Verzweigungen können mit den Branch-Instruktionen BRA, BRZ und BRP realisiert werden.
BRAsetzt den Programmzähler in jedem Fall auf die angegebene Adresse.BRZsetzt den Programmzähler auf die angegebene Adresse, wenn der Akkumulator gleich Null ist.BRPsetzt den Programmzähler auf die angegebene Adresse, wenn der Akkumulator nicht negativ ist.
Das folgende Programm gibt N aus, falls der Benutzer 0 eingibt. Ansonsten gibt es J aus.
asm
INP
BRZ false
LDA j
BRA output
false LDA n
output OTC
n DAT 78
j DAT 74Der Befehl OTC interpretiert die Zahl im Akkumulator als ASCII-Code und gibt das entsprechende Zeichen aus.
Verzweigung 1
- Führen Sie das oben stehende Beispiel aus.
- Wieso ist die Instruktion
BRA outputnötig? - Zeichnen Sie ein Flussdiagramm des Programms.
Verzweigung 2
Schreiben Sie ein Programm, welches zwei Zahlen einliest und die grössere davon ausgibt.
Schleifen
Schleifen können ebenfalls mit den Branch-Instruktionen realisiert werden. Zusätzlich wird eine Variable benötigt, welche bei jedem Schleifendurchlauf heruntergezählt wird.
Das folgende Programm gibt die Zahlen von 10 bis 1 aus:
asm
loop LDA i
OUT
SUB one
STA i
BRZ finish
BRA loop
finish HLT
one DAT 1
i DAT 10Schleife 1
- Führen Sie das oben stehende Beispiel aus.
- Zeichnen Sie ein Flussdiagramm des Programms.
Schleife 2
Schreiben Sie ein Assemblerprogramm, welches die Zahlen von 1 bis 100 in aufsteigender Reihenfolge ausgibt.
Multiplikation
Prozessoren unterstützen nicht alle (mathematischen) Operationen hardwaremässig. Frühe Prozessoren und auch der LMC können nicht multiplizieren. Deshalb muss die Multiplikation programmiert werden. Ein einfacher Multiplikationsalgorithmus lautet:
- Speichern Sie die beiden Faktoren als
aundb. - Speichern Sie 0 als
prod. - Addieren Sie
azuprod. - Subtrahieren Sie 1 von
b. - Wiederholen Sie die Schritte 3 bis 4, bis
bgleich 0 ist. - Geben Sie
prodals Resultat aus.
Multiplikation
Schreiben Sie ein Assemblerprogramm, welches diesen Multiplikationsalgorithmus umsetzt. Es soll zwei Zahlen einlesen und deren Produkt ausgeben.
Weitere Programmierideen
Division
Schreiben Sie ein Assemblerprogramm, welches zwei Zahlen dividiert.
Fibonacci-Folge
Schreiben Sie ein Assemblerprogramm, welches die Fibonacci-Folge ausgibt.
ggT
Schreiben Sie ein Assemblerprogramm, welches den grössten gemeinsamen Teiler zweier eingegebener Zahlen ausgibt.
Primzahlen
Schreiben Sie ein Assemblerprogramm, welches die Primzahlen ausgibt.
Codierung
Schreiben Sie ein Assemblerprogramm, welches die eingegebene Zahl als Binärzahl bzw. als Hexadezimalzahl ausgibt. Dabei muss jede Ziffer einzeln ausgegeben werden.