Mathe machen
Alle Berechnungen finden zwischen Registern statt. Eine arithmetische Anweisung nennt das Ziel zuerst, gefolgt von den beiden Quellen, die sie liest: bedeutet dest = src1 + src2.
add legt t0 + t1 in t2 ab.
t0 und t1, immer in dieser Reihenfolge. Sie treten in dieselbe Form ein, unabhängig davon, welche Operation läuft: Addition, Subtraktion, Multiplikation, Division oder Rest. Zwei Werte gehen hinein, eine Operation findet statt, und ein Ergebnis kommt rechts in t2 heraus. nennt t2 zuerst, weil dort das Ergebnis landet, was der einen Reihenfolgeregel entspricht, die jede arithmetische Anweisung in dieser Lektion befolgt.Addieren und Subtrahieren
nimmt die in zwei Registern gehaltenen Zahlen und speichert ihre Summe in einem dritten. macht dasselbe für die Subtraktion: berechnet t0 - t1. Beide Anweisungen lesen nur aus Registern.
add t2, t0, t1 # t2 = t0 + t1sub t2, t0, t1 # t2 = t0 - t1
Eine Sache, die man wissen sollte: Ein Register hält nur 32 Bits, es gibt also eine Obergrenze. Wenn ein Ergebnis zu groß ist, um hineinzupassen, wird kein Fehler ausgelöst. Der Wert läuft stillschweigend um zu sehr niedrigen Zahlen, und die Ausführung geht weiter. Alltägliche Werte werden dieses Limit nicht erreichen, aber die Obergrenze ist es wert, gekannt zu werden.
Um eine feste Zahl anstelle eines zweiten Registers zu verwenden, füge den Buchstaben i hinzu, der für immediate steht: addiert die Konstante 1. Es gibt kein subi, also addiert man zum Subtrahieren einer Konstante eine negative: .
Multiplizieren und Dividieren
multipliziert zwei Register. teilt sie als ganze Zahlen und verwirft den Bruch, also ergibt 7 / 2 3. gibt den Rest, also ergibt 7 % 2 1. Division verursacht nie einen Absturz. Division durch null gibt -1 zurück.
mul t2, t0, t1 # t2 = t0 * t1div t2, t0, t1 # t2 = t0 / t1 (ganzzahlig)rem t2, t0, t1 # t2 = t0 % t1 (Rest)
Alles zusammenfügen
li t0, 7li t1, 5add t1, t0, t1 # t1 = 7 + 5 = 12mv a0, t1 # der Ausgabedienst liest a0li a7, 1ecallli a7, 10ecall
lädt 7 in t0. lädt 5 in t1. addiert sie und schreibt 12 in t1. kopiert das Ergebnis nach a0, weil der Druckdienst seinen Wert immer aus a0 liest. Dann wählt den Ganzzahl-Druckdienst aus, und führt ihn aus. Schließlich beenden und das Programm.
Bonus: Multiplizieren mit Verschiebungen
Wenn der Faktor eine Zweierpotenz ist, existiert eine schnellere Methode als . (logische Linksverschiebung) verschiebt die Bits eines Registers nach links, und jede verschobene Position verdoppelt den Wert: um 1 verschieben, um mit 2 zu multiplizieren, um 2 für 4, um 3 für 8. Verschieben kostet weniger als Multiplizieren, daher nutzen Compiler es oft.
li t0, 5 # beginne mit 5# 3 Bits nach links verschieben (5 * 2^3 = 5 * 8)sll a0, t0, 3 # a0 = 40li a7, 1 # Ganzzahl ausgebenecallli a7, 10ecall
legt 5 in t0. verschiebt seine Bits um drei Stellen nach links. Jede Stelle verdoppelt den Wert, also verdoppelt sich 5 dreimal (5, 10, 20, 40), was 40 in a0 ergibt. Der Rest folgt dem Druckmuster von vorher. Versuche, die 3 in eine 1 oder 2 zu ändern, und sage das Ergebnis voraus, bevor du es ausführst.
5 um 0 Bits nach links verschoben bleibt 5.
