Programming lesson
MARIE-Assembler-Tutorial: Multiplikation durch Addition – Ein praktischer Leitfaden für CDA3103
Lerne, wie du in MARIE-Assembler eine Multiplikation durch wiederholte Addition implementierst – ein Kernkonzept der Computerlogik für dein CDA3103-Projekt.
Einführung in die MARIE-Architektur und das Projekt
Im Rahmen des CDA3103-Projekts sollst du einen MARIE-Assembler-Code schreiben, der den Ausdruck z = a * b * c berechnet. Da MARIE keinen Multiplikationsbefehl besitzt, musst du die Multiplikation durch wiederholte Addition realisieren. Dieses Tutorial führt dich Schritt für Schritt durch die notwendigen Konzepte und zeigt dir, wie du eine effiziente Lösung implementierst.
Grundlagen der Multiplikation in MARIE
Die Multiplikation zweier positiver Zahlen lässt sich als wiederholte Addition darstellen: a * b = a + a + ... + a (b-mal). Für drei Faktoren (a * b * c) berechnest du zuerst temp = a * b und dann z = temp * c. MARIE bietet nur grundlegende Befehle wie Load, Add, Subt, Store, Input, Output, Skipcond und Jump. Schleifen realisierst du mit bedingten Sprüngen.
Schleifenlogik für wiederholte Addition
Angenommen, du willst a * b berechnen. Du initialisierst ein Ergebnisregister mit 0 und einen Zähler mit b. Dann addierst du a zum Ergebnis, dekrementierst den Zähler und wiederholst, bis der Zähler null ist. Dies lässt sich mit Skipcond und Jump umsetzen.
Schritt-für-Schritt-Implementierung
1. Einlesen der Werte und Ausgabe
Laut Aufgabenstellung müssen alle eingegebenen Werte sofort auf dem Bildschirm ausgegeben werden. Verwende dazu Input und direkt danach Output. Speichere die Werte in Variablen wie a, b und c.
Input
Store a
Output
Input
Store b
Output
Input
Store c
Output2. Subroutine für Multiplikation
Definiere eine Subroutine Multiply, die zwei Werte aus speziellen Speicherplätzen (z.B. Multiplier und Multiplicand) multipliziert und das Ergebnis in Result ablegt. Verwende einen Zähler Counter.
Multiply, Load Multiplicand
Add Result
Store Result
Load Counter
Subt One
Store Counter
Skipcond 400 ; wenn Counter == 0, überspringe nächsten Befehl
Jump Multiply
JumpI ReturnAddrHinweis: Der Befehl Skipcond 400 prüft auf Gleichheit mit Null. Setze den Zähler vor dem Aufruf auf den Multiplikator.3. Hauptprogramm: Aufruf der Subroutinen
Rufe Multiply zweimal auf: zuerst für a * b, dann für das Zwischenergebnis mal c. Vergiss nicht, die Rücksprungadresse zu setzen.
Load b
Store Counter
Load a
Store Multiplicand
Load Zero
Store Result
Load ReturnAddr1
Store ReturnAddr
Jump Multiply
ReturnAddr1, Load Result
Store temp
Load c
Store Counter
Load temp
Store Multiplicand
Load Zero
Store Result
Load ReturnAddr2
Store ReturnAddr
Jump Multiply
ReturnAddr2, Load Result
Store z
Output
HaltVollständiges Programmbeispiel
Hier siehst du ein vollständiges, kommentiertes Programm. Denke daran, deinen Namen als Kommentar einzufügen.
/ MeinName
/ CDA3103 Projekt 1
/ Berechne z = a * b * c
/ MARIE-Assembler
Input
Store a
Output
Input
Store b
Output
Input
Store c
Output
/ Erste Multiplikation: a * b
Load b
Store Counter
Load a
Store Multiplicand
Load Zero
Store Result
Load RetAddr1
Store ReturnAddr
Jump Multiply
RetAddr1, Load Result
Store temp
/ Zweite Multiplikation: temp * c
Load c
Store Counter
Load temp
Store Multiplicand
Load Zero
Store Result
Load RetAddr2
Store ReturnAddr
Jump Multiply
RetAddr2, Load Result
Store z
Output
Halt
/ Subroutine Multiply
Multiply, Load Multiplicand
Add Result
Store Result
Load Counter
Subt One
Store Counter
Skipcond 400
Jump Multiply
JumpI ReturnAddr
/ Variablen
a, Dec 0
b, Dec 0
c, Dec 0
temp, Dec 0
z, Dec 0
Counter, Dec 0
Multiplicand, Dec 0
Result, Dec 0
ReturnAddr, Dec 0
Zero, Dec 0
One, Dec 1
RetAddr1, Dec 0
RetAddr2, Dec 0Testen mit dem MARIE-Simulator
Lade den MARIE-Simulator herunter (Anleitung auf Webcourses), öffne deine .mas-Datei und führe den Code aus. Gib positive Zahlen ein, z.B. 2, 3, 4 – das Ergebnis sollte 24 sein. Überprüfe, ob nach jeder Eingabe der Wert ausgegeben wird und am Ende das korrekte Produkt erscheint.
Häufige Fehler und Tipps
- Endlosschleife: Vergiss nicht, den Zähler zu dekrementieren und die Sprungbedingung richtig zu setzen.
- Registerkonflikte: Verwende für jede Subroutine eigene Variablen oder stelle sicher, dass die Werte vor dem Aufruf gespeichert werden.
- Skipcond-Code:
Skipcond 400springt, wenn der Akku = 0 ist;Skipcond 000bei < 0;Skipcond 800bei > 0.
Ausblick: Relevanz in der heutigen Tech-Welt
So wie MARIE Multiplikation durch Addition simuliert, basieren viele moderne KI-Beschleuniger (z.B. GPUs) auf simplen Rechenoperationen, die millionenfach wiederholt werden. Die Fähigkeit, grundlegende Algorithmen in Assembler zu implementieren, schärft das Verständnis für Hardwarenähe – ein entscheidender Vorteil in Bereichen wie Embedded Systems oder High-Frequency-Trading.
Zusammenfassung
Du hast gelernt, wie man in MARIE-Assembler eine Multiplikation durch wiederholte Addition implementiert. Dieses Wissen ist direkt auf dein CDA3103-Projekt anwendbar. Achte auf korrekte Schleifenlogik, Ausgabe der Eingabewerte und saubere Subroutinen. Viel Erfolg beim Testen!