Musterlösungen zum 6.¨Ubungsblatt
Musterlösungen zum 6.¨Ubungsblatt
Musterlösungen zum 6.¨Ubungsblatt
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Institut für Technische Informatik (ITEC)<br />
Institut für Anthropomatik (IFA)<br />
Rechnerorganisation im Sommersemester 2011<br />
<strong>Musterlösungen</strong> <strong>zum</strong> 6. Übungsblatt<br />
Lösung 1<br />
1. Registerinhalte:<br />
Register Inhalt<br />
$t1 $t1 = 0x0000 0008<br />
$t2 $t2 = 0x0000 000C<br />
$t3 $t3 = 0x0000 0010<br />
$t4 $t4 = 0x0000 0013<br />
2. MIPS-Code zur Speicherung der Adresse von vec im Register $s0:<br />
la $s0, vec<br />
3. Programmschleife zur Ausgabe der ersten fünf Elemente aus vec:<br />
.data<br />
vec: .word 8, 12, 16, 19, 2002, 0, 0, 0, 0, 0<br />
leer: .asciiz " "<br />
.text<br />
Prof. Dr. J. Henkel<br />
Dr.-Ing. T. Asfour<br />
Dipl.-Inform. Ö. Terlemez<br />
Dipl.-Inform. M. Kröhnert<br />
Adenauerring 2, Geb. 50.20<br />
Email: ti@ira.uka.de<br />
Web: http://ti.ira.uka.de<br />
la $s0, vec # Adresse von vec in $a0<br />
addi $t0, $0, 0 # Zaehler = 0<br />
addi $t1, $0, 5 # <strong>zum</strong> Beenden der Schleife<br />
add $t2, $0, $s0<br />
loop: lw $a0, 0($t2) # Element aus vec in $a0 laden<br />
li $v0, 1 # print_int<br />
syscall<br />
la $a0, leer<br />
li $v0, 4 # print-str (Leerzeichen)<br />
syscall<br />
addi $t0, $t0, 1 # Zaehler inkrementieren<br />
addi $t2, $t2, 4 # Zeiger auf vec inkrementieren<br />
bne $t0, $t1, loop
<strong>Musterlösungen</strong> <strong>zum</strong> 6. Übungsblatt zur Vorlesung ” Rechnerorganisation“ im Sommersemester 20112<br />
Lösung 2<br />
# Berechnung der Quadratwurzel<br />
.data<br />
cr_string: .asciiz "\n" # Sonderzeichen "neue Zeile"<br />
eingabe_str: .asciiz "Bitte geben Sie eine positive Integer-Zahl ein: "<br />
result_str: .asciiz "Ergebnis = "<br />
.text<br />
# Prozedur: Ausgabe eine Integer-Zahl mit CR<br />
print_int: li $v0, 1 # print_int<br />
syscall<br />
la $a0, cr_string<br />
li $v0, 4 # print-str (cr_string)<br />
syscall<br />
jr $ra<br />
# Prozedur: Quadratwurzel einer Integerzahl (Parameter in $a0, Ergebnis in $v0)<br />
sqrt_int: move $t0, $a0 # Argument in $t0 sichern<br />
label1: move $t2, $t0 # altes Ergebnis in $t2 sichern<br />
divu $a0, $t0 # Teile $a0 durch $t0 (x_n)<br />
mflo $t1 # Lade Quotient aus Register LO in $t2<br />
addu $t0, $t0, $t1 # addiere Quotient zu $t0 (a / x_n)<br />
srl $t0, $t0, 1 # halbiere $t0<br />
bgt $t2, $t0, label1 # wenn $t2 (altes Ergebnis) > $t0, dann zu label1<br />
move $v0, $t2 # Ergebnis in $v0 schreiben<br />
jr $ra<br />
# Start des Hauptprogrammes<br />
.globl main<br />
main: subu $sp, $sp, 8 # Stack Frame ist 8 Bytes<br />
sw $ra, 4($sp) # Sichern der Ruecksprungadresse<br />
sw $fp, 8($sp) # Sichern des alten Frame-Pointers<br />
addu $fp, $sp, 8 # neuen Frame-Pointer definieren<br />
la $a0, eingabe_str # print_str<br />
li $v0, 4<br />
syscall<br />
li $v0, 5 # read_int (a einlesen)<br />
syscall<br />
move $a0, $v0 # a im Register $a0 speichern<br />
jal sqrt_int # Quadratwurzel berechnen<br />
move $s0, $v0 # Ergebnis in $s0 sichern<br />
la $a0, result_str<br />
li $v0, 4 # print_str (result_str)<br />
syscall<br />
move $a0, $s0 # Ausgabe Ergebnis<br />
jal print_int<br />
lw $ra, 4($sp) # Ruecksprungadresse wiederherstellen<br />
lw $fp, 8($sp) # Frame-Pointer wiederherstellen<br />
addu $sp, $sp, 8 # Stack-Frame loeschen<br />
jr $ra
<strong>Musterlösungen</strong> <strong>zum</strong> 6. Übungsblatt zur Vorlesung ” Rechnerorganisation“ im Sommersemester 20113<br />
Lösung 3<br />
# Berechnung der ersten k Primzahlen<br />
.data<br />
cr_string: .asciiz "\n" # Sonderzeichen "neue Zeile"<br />
eingabe_str: .asciiz "Anzahl zu berechnender Primzahlen: "<br />
.text<br />
# Prozedur: Ausgabe einer Integer-Zahl mit CR<br />
print_int: li $v0, 1 # print_int<br />
syscall<br />
la $a0, cr_string<br />
li $v0, 4 # print_str<br />
syscall<br />
jr $ra<br />
# Prozedur: Quadratwurzel einer Integerzahl (Parameter in $a0, Ergebnis in $v0)<br />
sqrt_int: move $t0, $a0 # Argument sichern<br />
label1: move $t2, $t0 # altes Ergebnis sichern<br />
divu $a0, $t0 # Teile $a0 durch $t0<br />
mflo $t1 # Lade Quotient in $t2<br />
addu $t0, $t0, $t1 # addiere Quotient zu $t0<br />
srl $t0, $t0, 1 # Halbiere $t0<br />
bgtu $t2, $t0, label1 # wenn $t2 (altes Ergebnis) > $t0, dann zu label1<br />
move $v0, $t2 # Ergebnis nach $v0<br />
jr $ra<br />
# Start des Hauptprogrammes<br />
.globl main<br />
main: subu $sp, $sp, 8 # Stack Frame ist 8 Bytes<br />
sw $ra, 4($sp) # Sichern der Ruecksprungadresse<br />
sw $fp, 8($sp) # Sichern des alten Frame-Pointers<br />
addu $fp, $sp, 8 # neuen Frame-Pointer definieren<br />
la $a0, eingabe_str # Eingabeaufforderung<br />
li $v0, 4 # print_string<br />
syscall<br />
li $v0, 5 # read_int (Zahl k)<br />
syscall<br />
sll $s5, $v0, 2 # mal 4, wegen 32-Bit Integer-Zahl<br />
move $a0, $s5<br />
li $v0, 9 # sbrk (4 x Groesse eingelesener Zahl)<br />
syscall<br />
move $s6, $v0 # Adresse des Primzahlfeldes in $s6<br />
li $s0, 3 # zu pruefende Zahl jeweils in $s0 (n)<br />
move $s1, $zero # $s1 Zaehler fuer gefundene Primzahlen (f)<br />
loop1: bgeu $s1, $s5, fertig # wenn alle Primzahlen gefunden, dann zu fertig<br />
addu $s7, $s6, $s1 # Adresse fuer aktuelles Element in $s7 speichern ($s6 + Zaehler)<br />
sw $s0, ($s7) # gefundene Primzahl an Speicherstelle $s7 schreiben<br />
move $a0, $s0<br />
jal print_int # Ausgabe der Primzahl<br />
addu $s1, $s1, 4 # Zaehler fuer gefundene Primzahlen erhoehen
<strong>Musterlösungen</strong> <strong>zum</strong> 6. Übungsblatt zur Vorlesung ” Rechnerorganisation“ im Sommersemester 20114<br />
loop3: addu $s0, $s0, 2 # naechste zu pruefende ungerade Zahl in $s0 (n)<br />
move $a0, $s0<br />
jal sqrt_int # Quadratwurzel von $s0 (n) berechnen<br />
move $s3, $v0 # Quadratwurzel in $s3 sichern<br />
move $s2, $0 # Zaehler fuer zu pruefenden Dividenden := 0<br />
loop2: addu $s7, $s6, $s2<br />
lw $s4, ($s7) # Dividenden laden<br />
bgtu $s4, $s3, loop1 # wenn Dividend > sqrt($s0), dann zu loop1<br />
addu $s2, $s2, 4 # Zaehler fuer zu pruefende Dividenden erhoehen<br />
div $s0, $s4 # $s0 / $s4<br />
mfhi $s4 # Rest von $s0 / $s4 in $s4 speichern<br />
beqz $s4, loop3 # wenn $s4 = 0 (teilbar), dann zu loop3<br />
b loop2<br />
fertig: lw $ra, 4($sp) # Ruecksprungadresse wiederherstellen<br />
lw $fp, 8($sp) # Frame-Pointer wiederherstellen<br />
addu $sp, $sp, 8 # Stack-Frame loeschen<br />
jr $ra