Rechnerarchitektur im Sommersemester 2015 Übungsblatt 3

Werbung
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
Herunterladen