06.10.2013 Aufrufe

Musterlösungen zum 6.¨Ubungsblatt

Musterlösungen zum 6.¨Ubungsblatt

Musterlösungen zum 6.¨Ubungsblatt

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!