08.03.2014 Aufrufe

Technische Grundlagen der Informatik I 9. Poolraummusterlösung

Technische Grundlagen der Informatik I 9. Poolraummusterlösung

Technische Grundlagen der Informatik I 9. Poolraummusterlösung

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.

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!