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