Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

MIPS-Assembler-Tutorial: Dollar-Store-Rechner mit Mars Tool – Schritt-für-Schritt-Anleitung

Lerne, wie du in MIPS-Assembly einen einfachen Taschenrechner programmierst – inspiriert von einem Dollar-Store-Rechner. Dieses Tutorial zeigt dir die wichtigsten Schritte: Tasteneingabe, LCD-Ausgabe, Multiplikation/Division per Schleife und Zustandssteuerung. Perfekt für CS 0447 und ähnliche Projek

MIPS Assembly Tutorial Dollar Store Rechner Mars Tool Simple Calculator CS 0447 Projekt Taschenrechner Assembler MIPS Zustandsmaschine Multiplikation ohne mul Befehl Division ohne div Befehl Register $t8 $t9 MIPS Schleifenarithmetik Embedded Systems Assembler Computerarchitektur Übung MIPS Programmierung Beispiel Assembler Rechner Schritt für Schritt MIPS Tasteneingabe LCD Anzeige MIPS

Einführung: Der Dollar-Store-Rechner in MIPS-Assembly

Stell dir vor, du programmierst einen Taschenrechner, wie man ihn für ein paar Dollar im Supermarkt kaufen kann – nur dass du ihn selbst in MIPS-Assembly schreibst! Das ist die Aufgabe hinter dem Projekt CS 0447, bei dem du mit dem Mars Tool einen Simple Calculator steuerst. In diesem Tutorial lernst du, wie du Schritt für Schritt vorgehst, ohne die fertige Lösung zu kopieren. Du erfährst, wie du Tastendrücke in Register $t9 ausliest, Zahlen auf dem LCD in $t8 anzeigst und die Grundrechenarten per Schleife umsetzt – ganz ohne Multiplikations- oder Divisionsbefehle.

Warum ist das relevant? Heutzutage steckt in jeder Smartphone-App, jedem Spiel und sogar in KI-Anwendungen eine Logik, die auf simplen Rechenoperationen basiert. Wenn du verstehst, wie ein Prozessor auf unterster Ebene arbeitet, hast du einen riesigen Vorteil – sei es beim Entwickeln von Embedded Systems, beim Optimieren von Algorithmen oder einfach beim Bestehen deiner Prüfung.

Grundlagen: Hardware und Register

Der Simple Calculator im Mars Tool besteht aus einem LCD-Display (verbunden mit $t8) und einem Ziffernblock (verbunden mit $t9). Das LCD zeigt den Wert von $t8 an – egal ob positiv oder negativ. Der Ziffernblock meldet einen Tastendruck, indem er das Bit 31 von $t9 setzt und die unteren 4 Bits den Tastencode enthalten (siehe Tabelle). Wichtig: Du musst $t9 nach dem Auslesen wieder auf 0 setzen, damit neue Eingaben erkannt werden.

Beispiel: Drückt der Benutzer die Taste '5', steht in $t9 der Wert 0x80000005 (MSB=1, untere 4 Bits = 0101). Dein Programm muss diesen Wert auslesen, die Taste identifizieren und entsprechend reagieren.

Schritt 1: Tasteneingabe und Zahlenaufbau

Beginne mit einer Schleife, die $t9 überwacht. Sobald $t9 ungleich 0 ist, liegt eine Eingabe vor. Extrahiere die unteren 4 Bits mit andi $t0, $t9, 0x0F. Vergleiche dann mit den Codes: 0-9 für Ziffern, 10-13 für +,-,*,/, 14 für =, 15 für C (Clear).

Um eine mehrstellige Zahl aufzubauen, multiplizierst du den aktuellen Wert mit 10 und addierst die neue Ziffer. Da du keine mul-Instruktion verwenden darfst, nutze sll (Shift Left Logical) und Addition: sll $t1, $s0, 3 (x8) + sll $t2, $s0, 1 (x2) = x10. Addiere dann die Ziffer.

Beispiel: Aus den Tasten 5, 2, 9 wird die Zahl 529. Dein Code speichert den Zwischenwert in einem Register wie $s0 (operand1).

Schritt 2: Zustandsmaschine für die Rechnerlogik

Ein Dollar-Store-Rechner arbeitet mit einer Zustandsmaschine. Typische Zustände sind:

  • State 0: Initialisierung (nach C oder Start) – erwarte erste Ziffer.
  • State 1: Erste Zahl wird eingegeben – bei Operator wechsle zu State 2.
  • State 2: Operator wurde gedrückt – erwarte zweite Zahl.
  • State 3: Zweite Zahl wird eingegeben – bei = führe Berechnung aus und zeige Ergebnis.
  • State 4: Ergebnis wird angezeigt – nächste Eingabe startet neue Rechnung.

Speichere den aktuellen Zustand in einem Register (z.B. $s7). Verwende beq und j, um zwischen den Zuständen zu springen. Denk daran: Drückt der Benutzer mehrmals hintereinander einen Operator, wird der letzte verwendet – also überschreibe den Operator einfach.

Schritt 3: Multiplikation und Division per Schleife

Da du mul und div nicht verwenden darfst, implementierst du diese Operationen mit Schleifen. Für die Multiplikation: Addiere den ersten Operanden so oft, wie der zweite Operand angibt. Beispiel: 7 * 3 = 7+7+7. Für die Division: Subtrahiere den Divisor so lange vom Dividenden, bis das Ergebnis kleiner als der Divisor ist. Der Zähler ist der Quotient, der Rest ist der übrig gebliebene Wert.

Wichtig: Da keine negativen Zahlen als zweiter Operand erlaubt sind (laut Aufgabenstellung), musst du bei negativen Ergebnissen das Vorzeichen selbst verwalten. Ein Trick: Berechne zuerst mit positiven Werten und setze das Vorzeichen am Ende.

Schritt 4: Anzeige und Fehlerbehandlung

Das LCD zeigt automatisch den Wert von $t8 an. Du musst also nur dafür sorgen, dass $t8 den korrekten Wert enthält. Bei negativen Zahlen wird ein Minus vorangestellt – das erledigt die Hardware. Achte darauf, dass Division durch 0 vermieden wird (einfach keine Division durch 0 zulassen oder entsprechend behandeln).

Ein typischer Fehler: Wenn du nach der Berechnung das Ergebnis in $t8 speicherst, aber dann eine neue Ziffer eingibst, wird diese an das Ergebnis angehängt. Lösche daher nach jedem = die Operanden und setze den Zustand zurück.

Tipps und Fallstricke

  • Nutze nur die erlaubten Register ($s0-$s7, $t0-$t9). $t8 und $t9 sind für die Hardware reserviert.
  • Keine jal/jr – also keine Funktionen. Alles in einer Schleife mit Labels.
  • Keine Speicherzugriffe – keine lw/sw. Arbeite ausschließlich mit Registern.
  • Teste jeden Schritt einzeln: zuerst nur Ziffern, dann Operatoren, dann Rechnung.

Beispiel: Eine typische Berechnung

Angenommen, der Benutzer drückt: C, 5, *, -, 9, =. Das ergibt 5 * (-9) = -45. Aber laut Aufgabenstellung wird der zuletzt gedrückte Operator verwendet, also erst * und dann –, aber weil nach * gleich – kommt, wird der Operator auf – gesetzt. Das Ergebnis ist 5 – 9 = -4. Deine Zustandsmaschine muss das abbilden: Nach der ersten Zahl (5) und dem ersten Operator (*) gehst du in State 2. Dann kommt ein weiterer Operator (–), also überschreibst du den Operator und bleibst in State 2. Dann kommt die zweite Zahl (9). Bei = wird 5 – 9 = -4 berechnet und angezeigt.

Zusammenfassung

Mit diesem Tutorial hast du eine solide Grundlage, um deinen eigenen MIPS-Taschenrechner zu programmieren. Die Konzepte – Registerverwaltung, Zustandsautomaten, Schleifenarithmetik – sind universell und helfen dir nicht nur bei CS 0447, sondern auch in fortgeschrittenen Kursen wie Computerarchitektur oder Embedded Systems. Wenn du die Schritte befolgst, wirst du schnell sehen, wie aus einfachen Befehlen ein funktionierender Rechner wird. Viel Erfolg!