Mathe machen

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.

Arithmetische Operation
t2, t0, t1←add
t0 = 7t1 = 5+t2 = 12

add legt t0 + t1 in t2 ab.

Die beiden von links eintretenden Linien sind 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.

Arithmetik registrieren
add t2, t0, t1 # t2 = t0 + t1
sub 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: .

💡
addiert eine Konstante. addiert zwei Register. Die beiden zu verwechseln ist der häufigste Anfängerfehler.

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.

Multiplizieren, Dividieren, Rest
mul t2, t0, t1 # t2 = t0 * t1
div t2, t0, t1 # t2 = t0 / t1 (ganzzahlig)
rem t2, t0, t1 # t2 = t0 % t1 (Rest)

Alles zusammenfügen

Zwei Zahlen addieren und ausgeben
li t0, 7
li t1, 5
add t1, t0, t1 # t1 = 7 + 5 = 12
mv a0, t1 # der Ausgabedienst liest a0
li a7, 1
ecall
li a7, 10
ecall

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.

Mit Verschiebungen mit 8 multiplizieren
li t0, 5 # beginne mit 5
# 3 Bits nach links verschieben (5 * 2^3 = 5 * 8)
sll a0, t0, 3 # a0 = 40
li a7, 1 # Ganzzahl ausgeben
ecall
li a7, 10
ecall

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.

Multiplizieren durch Verschieben
5sll a0, t0, 0
×2 →
10sll a0, t0, 1
×2 →
20sll a0, t0, 2
×2 →
40sll a0, t0, 3
0
0
0
0
0
1
0
1

5 um 0 Bits nach links verschoben bleibt 5.

Die acht Kästchen sind die Binärform der Zahl über ihnen, ein Bit pro Kästchen, von links nach rechts gelesen wie üblich. Die ganze Reihe um eine Position nach links zu verschieben ist dieselbe Operation wie mit 2 zu multiplizieren, weil das Verschieben einer Ziffer um eine Stelle nach links in jeder Basis ihren Wert mit dieser Basis multipliziert. Binär hat nur zwei Ziffern, also ist der Multiplikator 2. Dreimaliges Verschieben summiert sich zu einer Multiplikation mit 8, was dem entspricht, was mit der Zahl 5 macht.