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.
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.
Aufgabe: Verzweigung 1
- Führe das oben stehende Beispiel aus.
- Wieso ist die Instruktion
BRA outputnötig? - Zeichne ein Flussdiagramm des Programms.
Aufgabe: Verzweigung 2
Schreibe 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:
loop LDA i
OUT
SUB one
STA i
BRZ finish
BRA loop
finish HLT
one DAT 1
i DAT 10Aufgabe: Schleife 1
- Führe das oben stehende Beispiel aus.
- Zeichne ein Flussdiagramm des Programms.
Aufgabe: Schleife 2
Schreibe 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:
- Speichere die beiden Faktoren als
aundb. - Speichere 0 als
prod. - Addiere
azuprod. - Subtrahiere 1 von
b. - Wiederhole Schritte 3 bis 4, bis
bgleich 0 ist. - Gibt
prodals Resultat aus.
Aufgabe: Multiplikation
Schreibe ein Assemblerprogramm, welches diesen Multiplikationsalgorithmus umsetzt. Es soll zwei Zahlen einlesen und deren Produkt ausgeben.
Lösung: Multiplikation
INP
STA a
INP
STA b
loop LDA prod
ADD a
STA prod
LDA b
SUB one
STA b
BRZ done
BRA loop
done LDA prod
OUT
one DAT 1
a DAT 0
b DAT 0
prod DAT 0Weitere Programmierideen
Aufgabe: Division
Schreibe ein Assemblerprogramm, welches zwei Zahlen dividiert.
Lösung: Division
Erste Zahl: Ganzzahldivision
Zweite Zahl: Rest (modulo)
INP
STA a
INP
STA b
loop LDA a
SUB b
STA a
LDA div
ADD one
STA div
LDA a
BRP loop
LDA div
SUB one
OUT
LDA a
ADD b
OUT
one DAT 1
a DAT 0
b DAT 0
div DAT 0Aufgabe: Fibonaccizahlen
Schreibe ein Assemblerprogramm, welches die Fibonacci-Folge ausgibt.
Lösung: Fibonaccizahlen
OUT num2
loop LDA num1
ADD num2
STA buffer
LDA num2
STA num1
LDA buffer
STA num2
OUT buffer
BRA loop
num1 DAT 0
num2 DAT 1
buffer DAT 0loop LDA a
ADD b
OUT
STA a
LDA b
ADD a
OUT
STA b
BRA loop
HLT
a DAT 0
b DAT 1Aufgabe: ggT
Schreibe ein Assemblerprogramm, welches den grössten gemeinsamen Teiler zweier eingegebener Zahlen ausgibt.
Aufgabe: Primzahlen
Schreibe ein Assemblerprogramm, welches die Primzahlen ausgibt.
Aufgabe: Codierung
Schreibe ein Assemblerprogramm, welches die eingegebene Zahl als Binärzahl bzw. als Hexadezimalzahl ausgibt. Dabei muss jede Ziffer einzeln ausgegeben werden.