Skip to content

Assembler

Rechnerarchitektur

Verzweigungen

Verzweigungen können mit den Branch-Instruktionen BRA, BRZ und BRP realisiert werden.

  • BRA setzt den Programmzähler in jedem Fall auf die angegebene Adresse.
  • BRZ setzt den Programmzähler auf die angegebene Adresse, wenn der Akkumulator gleich Null ist.
  • BRP setzt 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 74

Der 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 output nö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:

asm
loop    LDA i
        OUT
        SUB one
        STA i
        BRZ finish
        BRA loop
finish  HLT
one     DAT 1
i       DAT 10

Aufgabe: 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:

  1. Speichere die beiden Faktoren als a und b.
  2. Speichere 0 als prod.
  3. Addiere a zu prod.
  4. Subtrahiere 1 von b.
  5. Wiederhole Schritte 3 bis 4, bis b gleich 0 ist.
  6. Gibt prod als Resultat aus.

Aufgabe: Multiplikation

Schreibe ein Assemblerprogramm, welches diesen Multiplikationsalgorithmus umsetzt. Es soll zwei Zahlen einlesen und deren Produkt ausgeben.

Lösung: Multiplikation
asm
        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 0

Weitere Programmierideen

Aufgabe: Division

Schreibe ein Assemblerprogramm, welches zwei Zahlen dividiert.

Lösung: Division

Erste Zahl: Ganzzahldivision
Zweite Zahl: Rest (modulo)

asm
        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 0

Aufgabe: Fibonaccizahlen

Schreibe ein Assemblerprogramm, welches die Fibonacci-Folge ausgibt.

Lösung: Fibonaccizahlen
asm
        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 0
asm
loop    LDA a
        ADD b
        OUT
        STA a
        LDA b
        ADD a
        OUT
        STA b
        BRA loop
        HLT
a       DAT 0
b       DAT 1

Aufgabe: 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.

Gymnasium Kirchenfeld, fts, lem & ros