Ludwig-Maximilians-Universität München Institut für Informatik Lehrstuhl für Mobile und Verteilte Systeme Prof. Dr. Claudia Linnhoff-Popien Rechnerarchitektur im Sommersemester 2015 Übungsblatt 3 Abgabetermin: 11.05.2015, 12:00 Uhr Besprechung: Besprechung der T-Aufgaben in den Tutorien vom 04. – 08. Mai 2015 Besprechung der H-Aufgaben in den Tutorien vom 11. – 15. Mai 2015 Aufgabe 12: (H) Multiple Choice (5 Pkt.) Sind folgende Aussagen zum Thema SPIM richtig (r) oder falsch (f)? a SPIM hat eine Stack Architektur b c d e r f Der Stackpointer $sp zeigt nach Konvention auf das Wort, das zuletzt in den Stack geladen wurde. Nach der MIPS-Konvention für Unterprogrammaufrufe gehört das Register $ra zu den Callee-saved-Registern. Der Stapel-Speicher (Stack) arbeitet nach dem FIFO-Prinzip. Bei der Umwandlung einer 3-Byte in eine 4-Byte Zahl auf einer Little-EndianMaschine muss der Wert im Speicher um 1 Byte verschoben werden. Aufgabe 13: (H) Test des MIPS Simulators (6 Pkt.) Für diese Aufgabe sollten Sie sich mit dem MIPS-Simulator SPIM vertraut machen. Sie können einen MIPS-Simulator von der Vorlesungshomepage herunterladen, oder XSPIM aus dem CIP-Pool benutzen. – Laden Sie sich das Assemblerprogramm simple.s von der Rechnerarchitektur–Homepage herunter und speichern Sie es in Ihrem Home–Verzeichnis ab. – Geben Sie auf einem Terminal xspim ein, um den Simulator zu starten. – In dem erscheinenden Fenster wählen Sie load, geben dann den Dateinamen der Programmdatei ein (simple.s) und klicken auf assembly file. – Nun können Sie das Programm mit run ausführen. Dabei sollte eine Konsole erscheinen, über die die Ein- und Ausgabe erfolgt. Beantworten Sie nun folgende Fragen. a. Welches Ergebnis liefert das Programm für die Eingabefolge "1, 2, 3, 4, 0"? (D.h. nach Start des Programms erfolgt über die Konsole die Eingabe "1", gefolgt von Enter, dann die Eingabe "2", gefolgt von Enter, usw.) Rechnerarchitektur – SoSe 15, Übungsblatt 3 2 b. Kommentieren Sie jede Zeile des Programms sinnvoll. (Geben Sie bei Ihrer Abgabe die Zeilennummer und den zugehörigen Kommentar an.) c. Welche mathematische Funktion berechnet das Programm? Aufgabe 14: (H) Umsetzung Boolescher Ausdrücke (6 Pkt.) Übersetzen Sie folgendes Pseudocodefragment in MIPS-Code. Gehen Sie davon aus, dass der Wert der Variablen a bereits in das Register $t0 geladen wurde. 1 2 3 4 5 IF (a < 0) OR (a > 99) THEN a := a - 10; ELSE a := a - 1; END; Bedenken Sie dabei insbesondere: Der Ausdruck a > 99 wird nur dann ausgewertet, wenn a < 0 fehlgeschlagen ist. Aufgabe 15: (T) SPIM Programmieraufgabe (– Pkt.) Erstellen Sie ein vollständiges SPIM–Programm, das folgendes durchführt: ∙ Es werden zwei positive Integer–Zahlen von der Konsole eingelesen. ∙ Es wird der Durchschnitt dieser beiden Zahlen auf eine Nachkommastelle genau berechnet. ∙ Das Ergebnis der Berechnung wird ausgegeben. Tipp: Programmieren Sie diejenigen Schritte, die Sie auch beim handschriftlichen Dividieren durchführen! Beachten Sie hierbei folgendes: ∙ Verwenden Sie nur die unten aufgeführten Befehle. ∙ Verwenden Sie für die Vorkommazahl das Register $s0 und für die Nachkommazahl das Register $s1, ansonsten nur die temporären Register. ∙ Kommentieren Sie ihr Programm sinnvoll! ∙ Sowohl die Eingabe als auch die Ausgabe soll mit einem Anweisungstext versehen werden, wie z.B. ”Geben Sie die 1. Zahl ein: ”, etc. ∙ Die Ausgabe des Ergebnisses soll das Komma enthalten. Rechnerarchitektur – SoSe 15, Übungsblatt 3 3 Aufgabe 16: (T) Endständige Rekursion (– Pkt.) In der Vorlesung „Programmierung und Modellierung“ lernen Sie den Begriff der endständigen Rekursion kennen. Pn In dieser Aufgabe soll die Bedeutung endständiger Rekursion anhand der Addition Sn := i=1 i untersucht werden. Laden Sie sich dazu die Datei endstaendig_rahmen.s von der Vorlesungsseite herunter. Den Rahmen dürfen Sie in dieser Aufgabe nur an den angegebenen Stellen ergänzen, nicht jedoch verändern. Hinweis: Machen Sie sich zunächst mit der Stackprogrammierung und dem Aufruf von Unterprogrammen in SPIM vertraut. a. Durch folgendes Programmfragment kann Sn berechnet werden: int sum(int n) { if(n == 0) { return 0; } else { return sum(n - 1) + n; } } Programmieren Sie dieses Fragment an der angegebenen Stelle in der Datei aus. b. Folgendes Programmfragment berechnet Sn mittels endständiger Rekursion: int sum2(int n, int akk) { if(n == 0) { return akk; } else { return sum2(n - 1, akk + n); } } Übertragen Sie auch dieses Fragment an die entsprechende Stelle im vorgegebenen Rahmen. c. Vergleichen Sie Ihre Programmteile. Für welches würden Sie sich bei knappen Ressourcen entscheiden. Warum? d. Schlagen Sie ein noch besseres Verfahren zur Berechnung von Sn vor. Überblick über die wichtigsten SPIM Assemblerbefehle Rechnerarchitektur – SoSe 15, Übungsblatt 3 Befehl add sub addu subu addi addiu div rem mul b j jal jr beq beqz bne bnez bge bgeu bgez bgt bgtu bgtz ble bleu blez blt bltu bltz not and or xori syscall move la lb lw li sw sh sb 4 Argumente Wirkung Rd, Rs1, Rs2 Rd, Rs1, Rs2 Rd, Rs1, Rs2 Rd, Rs1, Rs2 Rd, Rs1, Imm Rd, Rs1, Imm Rd, Rs1, Rs2 Rd, Rs1, Rs2 Rd, Rs1, Rs2 label label label Rs Rs1, Rs2, label Rs, label Rs1, Rs2, label Rs1, label Rs1, Rs2, label Rs1, Rs2, label Rs, label Rs1, Rs2, label Rs1, Rs2, label Rs, label Rs1, Rs2, label Rs1, Rs2, label Rs, label Rs1, Rs2, label Rs1, Rs2, label Rs, label Rd, Rs1 Rd, Rs1, Rs2 Rd, Rs1, Rs2 Rd, Rs1, Imm Rd := Rs1 + Rs2 (mit Überlauf) Rd := Rs1 - Rs2 (mit Überlauf) Rd := Rs1 + Rs2 (ohne Überlauf) Rd := Rs1 - Rs2 (ohne Überlauf) Rd := Rs1 + Imm Rd := Rs1 + Imm (ohne Überlauf) Rd := Rs1 DIV Rs2 Rd := Rs1 MOD Rs2 Rd := Rs1 × Rs2 unbedingter Sprung nach label unbedingter Sprung nach label unbed.Sprung nach label, Adresse des nächsten Befehls in $ra unbedingter Sprung an die Adresse in Rs Sprung, falls Rs1 = Rs2 Sprung, falls Rs = 0 Sprung, falls Rs1 ̸= Rs2 Sprung, falls Rs1 ̸= 0 Sprung, falls Rs1 ≥ Rs2 Sprung, falls Rs1 ≥ Rs2 Sprung, falls Rs ≥ 0 Sprung, falls Rs1 > Rs2 Sprung, falls Rs1 > Rs2 Sprung, falls Rs > 0 Sprung, falls Rs1 ≤ Rs2 Sprung, falls Rs1 ≤ Rs2 Sprung, falls Rs ≤ 0 Sprung, falls Rs1 < Rs2 Sprung, falls Rs1 < Rs2 Sprung, falls Rs < 0 Rd := ¬ Rs1 (bitweise Negation) Rd := Rs1 & Rs2 (bitweises UND) Rd := Rs1 | Rs2 (bitweises ODER) Rd := Rs1 = Imm (bitweises XOR) führt Systemfunktion aus Rd := Rs Adresse des Labels wird in Rd geladen Rd := MEM[Adr] Rd := MEM[Adr] Rd := Imm MEM[Adr] := Rs (Speichere ein Wort) MEM[Adr] MOD 216 := Rs (Speichere ein Halbwort) MEM[Adr] MOD 256 := Rs (Speichere ein Byte) Rd, Rd, Rd, Rd, Rd, Rs, Rs, Rs, Rs label Adr Adr Imm Adr Adr Adr Funktion print_int print_float print_double print_string read_int Code in $v0 1 2 3 4 5 Funktion read_float read_double read_string sbrk exit Code in $v0 6 7 8 9 10