Technische Grundlagen der Informatik I 9. Poolraummusterlösung
Technische Grundlagen der Informatik I 9. Poolraummusterlösung
Technische Grundlagen der Informatik I 9. Poolraummusterlösung
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Prof. Dr.-Ing. Sorin A. Huss<br />
<strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> I<br />
<strong>9.</strong> Poolraummusterlösung<br />
Wintersemester 2010/11<br />
Aufgabe 1 Pseudobefehle<br />
Der MIPS-Prozessor basiert auf <strong>der</strong> RISC-Architektur, d.h. bei <strong>der</strong> Konzipierung wurde darauf geachtet den Umfang<br />
des Befehlssatzes möglichst gering zu halten (RISC: Reduced Instruction Set Computer). Um die Entwicklung von MIPS-<br />
Programmen zu erleichtern wurden daher sogenannte Pseudobefehle eingeführt. Diese Befehle sollen die Verständlichkeit<br />
von MIPS-Programmen verbessern und die Anzahl an nötigen Befehlszeilen reduzieren. Da diese Befehle jedoch nicht von<br />
<strong>der</strong> Hardware ausgeführt werden können, müssen sie in eine Folge von Befehlen übersetzt werden die von <strong>der</strong> Hardware<br />
unterstützt werden.<br />
Übersetzten Sie die unten stehenden Pseudobefehle in möglichst einfache, von <strong>der</strong> MIPS-Hardware ausführbare Befehle.<br />
Welche Befehle tatsächlich unterstützt werden und bei welchen Befehlen es sich um Pseudobefehle handelt entnehmen<br />
Sie dem bereit gestellten Befehlssatz “MIPS®-R2000“.<br />
• MOVE R D , R S<br />
R D = R S<br />
• LI R D , I M M 32 R D = I M M 32<br />
• BGT R S , R T , Label<br />
i f (R S > R T ) PC = Label<br />
Pseudobefehl Effekt Umsetzung<br />
MOVE R D , R S R D = R S ADD R D , $Z ERO, R S<br />
LI R D , I M M 32 R D = I M M 32 LUI R D , I M M 32[31 : 16]<br />
ORI R D , R D , I M M 32[15 : 0]<br />
BGT R S , R T , Label i f (R S > R T ) PC = Label SLT R D , R T , R S<br />
BNE R D , $Z ERO, Label<br />
Aufgabe 2 Optimierung<br />
In Übung 10 Aufgabe 1 sollten Sie mehrere 32Bit Werte zwischen Big- und Little-Endian konvertieren. Überlegen Sie sich<br />
nun eine zweite Implementierung für dieses Problem. Diese soll jedoch nur einen einzigen Wert von <strong>der</strong> Speicheradresse<br />
value lesen und konvertieren sowie das Ergebnis in Register v0 vorhalten.<br />
Ihre zweite Lösung soll dabei mit weniger Registern auskommen wie die in <strong>der</strong> 10. Musterlösung angegebene (5 Register)<br />
o<strong>der</strong> Ihre selbst gefundene Version (je nachdem, welche weniger Register benötigt).<br />
Zählen Sie dazu nur Register, welche tatsächlich bei <strong>der</strong> Konvertierung benötigt werden. Beachten Sie dabei aber auch<br />
solche Register, die durch Pseudobefehle beim assemblieren unbeabsichtigt hinzugefügt werden. Ob dies <strong>der</strong> Fall ist, erkennen<br />
Sie bei MARS an den zu dem Pseudobefehl korrespondierenden Zellen in <strong>der</strong> Spalte Basic im Reiter Execute.<br />
Ignorieren Sie alle Register die nicht zur Konvertierung beitragen um die Ergebnisse miteinan<strong>der</strong> vergleichen zu können.<br />
Dazu zählen beispielsweise Register für den Schleifenzähler aus Übung 10 Aufgabe 1 (in <strong>der</strong> Musterlösung Register t5),<br />
das laden von Adressen (Pseudobefehl, welcher ein zusätzliches Register verwendet; in Übung 10 Aufgabe 1 als gegeben<br />
angenommen) o<strong>der</strong> an<strong>der</strong>weitig verwendete Register.<br />
Alexan<strong>der</strong> Bie<strong>der</strong>mann bie<strong>der</strong>mann@iss.tu-darmstadt.de (0 61 51) 16-6710 – Marc Stöttinger stoettinger@iss.tu-darmstadt.de (0 61 51) 16-704701
Wenn Sie keine bessere Lösung finden können, überlegen Sie sich warum es keine Lösung mit weniger Registern geben<br />
kann und warum Ihre Lösung trotzdem nicht optimal sein muss.<br />
Sie können für Ihre Implementierung das vorgegebene Template nutzen, welches Ihnen eine Prüfung Ihres Ergebnisses<br />
bereit stellt.<br />
Eine auf ein Minimum an verwendeten Registern optimierte Lösung benötigt zwei Register um die Konvertierung<br />
zwischen Big- und Little-Endian durchzuführen. Dabei ist es offensichtlich, dass es keine Lösung mit weniger Registern<br />
geben kann:<br />
Eines <strong>der</strong> Register wird benötigt um die Adresse des zu lesenden/schreibenden Wortes zu speichern. Das zweite Register<br />
speichert den Wert des Datenwortes byte-weise zur Weiterverarbeitung zwischen. Unter Zuhilfenahme des Speichers<br />
genügen diese beiden Register um eine Konvertierung durchzuführen.<br />
. data . word<br />
value : 0x12345678 0x00000000<br />
. a s c i i z<br />
c o r r e c t : " Konvertierung e r f o l g r e i c h "<br />
missed : " Konvertierung f e h l g e s c h l a g e n "<br />
. t e x t<br />
l a $t0 , value # Laden <strong>der</strong> Adresse des zu konvertierenden Wortes<br />
l b $v0 , 0( $t0 ) # Laden des e r s t e n Bytes ; Speichern a l s v i e r t e s Byte<br />
addi $t0 , $t0 , 4<br />
sb $v0 , 3( $t0 ) # Anm:<br />
addi $t0 , $t0 , −4 # subi $t0 , $t0 , 4: Pseudobefehl , <strong>der</strong> z u s a e t z l i c h e s R e g i s t e r verwendet<br />
l b $v0 , 1( $t0 ) # Laden des zweiten Bytes ; Speichern a l s d r i t t e s Byte<br />
addi $t0 , $t0 , 4<br />
sb $v0 , 2( $t0 )<br />
addi $t0 , $t0 , −4<br />
l b $v0 , 2( $t0 ) # Laden des d r i t t e n Bytes ; Speichern a l s zweites Byte<br />
addi $t0 , $t0 , 4<br />
sb $v0 , 1( $t0 )<br />
addi $t0 , $t0 , −4<br />
l b $v0 , 3( $t0 ) # Laden des v i e r t e n Bytes ; Speichern a l s e r s t e s Byte<br />
addi $t0 , $t0 , 4<br />
sb $v0 , 0( $t0 )<br />
lw $v0 , 0( $t0 ) # Laden des v o l l s t a e n d i g k o n v e r t i e r t e n Wortes in R e g i s t e r v0<br />
t e s t :<br />
l i $t0 , 0x78563412<br />
bne $v0 , $t0 , f a i l<br />
match :<br />
l i $v0 , 4<br />
l a $a0 , c o r r e c t<br />
s y s c a l l<br />
l i $v0 , 10<br />
s y s c a l l<br />
f a i l :<br />
l i $v0 , 4<br />
l a $a0 , missed<br />
s y s c a l l<br />
l i $v0 , 10<br />
s y s c a l l<br />
Die hier gegebene Lösung ist unter <strong>der</strong> Bedingung die Anzahl <strong>der</strong> verwendeten Register zu minimieren optimal. Es sollte<br />
aber sofort auffallen, dass im Vergleich zur Musterlösung von Übung 10 Aufgabe 1 fast doppelt so viele Instruktionen<br />
zur Konvertierung eines Datenwortes benötigt werden. Die Konsequenz ist eine entsprechend längere Ausführungszeit.<br />
Ob eine Lösung optimal ist hängt somit von dem gesetzten, zu erreichenden Ziel ab. Damit ergeben sich für verschiedene<br />
Ziele in den aller meisten Fällen unterschiedliche Lösungen, die in <strong>der</strong> Regel im Wi<strong>der</strong>spruch zueinan<strong>der</strong> stehen und sich<br />
gegenseitig beeinflussen o<strong>der</strong> im Extremfall sogar ausschließen.<br />
2Alexan<strong>der</strong> Bie<strong>der</strong>mann bie<strong>der</strong>mann@iss.tu-darmstadt.de (0 61 51) 16-6710 – Marc Stöttinger stoettinger@iss.tu-darmstadt.de (0 61 51) 16-70470
Aufgabe 3 Stack<br />
Unter einem Zahlenpalindrom versteht man - analog zum klassischen Palindrom - eine Zahlenfolge, welche von Vorne<br />
als auch von Hinten gelesen den gleichen Zahlenwert ergibt. Ein Beispiel wäre die Zahlenfolge 2670762.<br />
Schreiben Sie ein Assembler-Programm, mit dem Sie zu einer gegebenen Zahlenfolge entscheiden können, ob es sich<br />
um ein Zahlenpalindrom handelt o<strong>der</strong> nicht. Gehen Sie bei Ihrer Lösung davon aus, dass im Speicher an Position length<br />
ein vier Byte langer Eintrag liegt, <strong>der</strong> die Anzahl Ziffern in <strong>der</strong> Zahlenfolge angibt. An Position numbers liegt die zu<br />
prüfende Zahl als Folge von Bytes, die die Ziffern aus dem Intervall 0-9 enthalten.<br />
. data . word<br />
length : 11<br />
. byte<br />
numbers : 0 , 1 , 2 , 3 , 4 , 5 , 4 , 3 , 2 , 1 , 0<br />
Als Einschränkung stehen Ihnen für Ihre Berechnung - für jede “beliebige“ Länge des Zahlenpalindroms - nur die Register<br />
t0 bis t7 und sp zur Verfügung. Für Ihre Lösung können Sie das vorgegebene Template verwenden.<br />
. data . word<br />
length : 22<br />
. byte<br />
numbers : 3 , 1 , 5 , 7 , 4 , 4 , 1 , 0 , 3 , 5 , 4 , 4 , 5 , 3 , 0 , 1 , 4 , 4 , 7 , 5 , 1 , 3<br />
. a s c i i z<br />
c o r r e c t : " Zahlenpalindrom erkannt "<br />
missed : " kein Zahlenpalindrom "<br />
. t e x t<br />
l a $t0 , length # Laenge <strong>der</strong> Z i f f e r n f o l g e laden<br />
lw $t1 , 0( $t0 )<br />
andi $t2 , $t1 , 1 # Laenge gerade o<strong>der</strong> ungerade ?<br />
s r l $t3 , $t1 , 1 # Laenge/2 bestimmen ( ab wann muss v e r g l i c h e n werden )<br />
move $t4 , $t3<br />
l a $t0 , numbers<br />
f i r s t _ h a l f : # E r s t e H a e l f t e <strong>der</strong> Z i f f e r n f o l g e im Stack speichern<br />
l b $t1 , 0( $t0 )<br />
subi $sp , $sp , 1<br />
sb $t1 , 0( $sp )<br />
addi $t0 , $t0 , 1<br />
subi $t3 , $t3 , 1<br />
bnez $t3 , f i r s t _ h a l f<br />
beqz $t2 , compare # Wenn Z i f f e r n f o l g e ungerade Laenge , Z i f f e r in <strong>der</strong> Mitte ueberspringen<br />
addi $t0 , $t0 , 1<br />
compare : # Zweite H a e l f t e <strong>der</strong> Z i f f e r n f o l g e mit S t a c k i n h a l t v e r g l e i c h e n<br />
l b $t1 , 0( $t0 ) # Aufgrund <strong>der</strong> LiFo−S t r u k t u r des Stack sind keine Vertauschungen<br />
l b $t2 , 0( $sp ) # noetig<br />
addi $sp , $sp , 1<br />
bne $t1 , $t2 , no_palindrom<br />
addi $t0 , $t0 , 1<br />
subi $t4 , $t4 , 1<br />
bnez $t4 , compare<br />
palindrom :<br />
l i $v0 , 4<br />
l a $a0 , c o r r e c t<br />
s y s c a l l<br />
l i $v0 , 10<br />
s y s c a l l<br />
no_palindrom :<br />
l i $v0 , 4<br />
l a $a0 , missed<br />
s y s c a l l<br />
l i $v0 , 10<br />
s y s c a l l<br />
Alexan<strong>der</strong> Bie<strong>der</strong>mann bie<strong>der</strong>mann@iss.tu-darmstadt.de (0 61 51) 16-6710 – Marc Stöttinger stoettinger@iss.tu-darmstadt.de (0 61 51) 16-704703