Assembler

Der Grossteil der Informationen findest du in den Slides. Unten findest du primär Aufträge und Links.

2021_22_assembler_i.pdf

Slides Branching / Labels

Code Name Description
0 HLT Stop (Little Man has a rest).
1 ADD Add the contents of the memory address to the Accumulator
2 SUB Subtract the contents of the memory address from the Accumulator
3 STA or STO Store the value in the Accumulator in the memory address given.
4 This code is unused and gives an error.
5 LDA Load the Accumulator with the contents of the memory address given
6 BRA Branch - use the address given as the address of the next instruction
7 BRZ Branch to the address given if the Accumulator is zero
8 BRP Branch to the address given if the Accumulator is zero or positive
9 INP or OUT Input or Output. Take from Input if address is 1, copy to Output if address is 2.
9 OTC Output accumulator as a character if address is 22. (Non-standard instruction)
9 DAT Used to indicate a location that contains data.

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).
  2. Schreibe die beiden Zahlen, die du addieren möchtest, am richtigen Ort in den Speicher.
  3. Führe das Programm wiederholt aus. Verfolge genau, was wann passiert:
    1. Beobachte den Instruktionszyklus.
    2. Stelle sicher, dass du alles verstehst.
  4. Schreibe den Code so um, dass nun vier Zahlen addiert werden können.

Nun wollen wir ein einfaches if-else-Statement 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 verwenden wir die Branch-Elemente in Assembler. Mit diesen kann der aktuelle Wert im Accumulator überprüft werden und man kann an eine bestimmte Stelle springen.

        ...
        BRP JMP // if accumulator is zero or positive, jump to line marked with JMP
        ...
JMP     ...
        ...
  1. Studiere im Manual die Befehle BRA, BRZ, BRP
  2. Schreibe ein Assembler-Programm, in welchem dem man zuerst zwei Zahlen eingeben kann. Von diesen wird das Maximum bestimmt und ausgegeben.

Schreibe Assembler-Code, der einen Countdown ausführt:

  • eine Zahl wird eingelesen
  • wiederholen, solange die Zahl >= 0 ist:
    • die Zahl wird ausgeben
    • die Zahl wird um 1 verringert

Hinweise:

  • mit 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.
  • die Wiederholung benötigt eine Sprung-Instruktion (Branch, Instruktionen 6-8) - welcher ist der richtige?

Lösung:

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.​
  • gf_informatik/assembler_sca.1656484823.txt.gz
  • Zuletzt geändert: 2022-06-29 06:40
  • von sca