Proseminar Digitale Rechenanlagen WS 12/13 Übungszettel 10 51. Die komplexe Multiplikation e + if = (a + ib)(c + id) = (ac − bd) + i(ad + bc) ist auf einer Registermaschine (mit Registern R1, R2, . . . ) zu implementieren. Befehle sind: LOAD r,v, STORE v,r, MULT r,r,r, ADD r,r,r, SUB r,r,r und NOP, wobei r ein beliebiges Register, v eine Variable aus dem Speicher und NOP eine leere Operation ist, die nichts tut. Jede Instruktion benötigt einen Taktzyklus. Allerdings gilt die Einschränkung, dass ein Register erst drei Taktzyklen nach dem Beschreiben wieder ausgelesen werden darf, also nach zwei eingeschobenen Instruktionen. Schreiben Sie das Programm zuerst schlecht, indem Sie Variablen erst unmittelbar vor der ersten Benutzung laden und unmittelbar nach der Berechnung speichern. Fügen Sie NOPs ein, um die Einschränkung zu berücksichtigen. Versuchen Sie dann, die Instruktionen so umzuordnen, dass die Anzahl der NOPs minimiert wird. Berechnen Sie in beiden Fällen die CPI-Rate, wobei NOP nicht als Instruktion zählt, jedoch einen Taktzyklus verbraucht. Berechnen Sie auch den Speedup, der sich durch die NOP-Minimierung ergibt. 52. Lesen Sie die Einführung in die DLX-Programmierung und die Dokumentation zu WinDLX (oder Vergleichbares), versuchen Sie, einfache Programme in WinDLX laufen zu lassen, und beantworten Sie folgende Fragen: (a) (b) (c) (d) Welche Bedeutung haben .data und .text? Was ist der Unterschied zwischen add, addu, addi, addui, addf und addd? Was sind Pointer und wozu braucht man sie? Was macht der Befehl jal? 53. Schreiben Sie ein DLX-Programm, das die abgerundete Wurzel b einer natürlichen Zahl a mittels Intervallhalbierung berechnet, entsprechend folgendem Java-Codeausschnitt: int a = 81, b; int u = 0, o = a, m = o/2; while (m != u) { if (m*m > a) o = m; else u = m; m = (o+u)/2; } b = m; 54. In einer DLX–Maschine sei das Multiplizierwerk fehlerhaft. Beheben Sie den Fehler, indem Sie ein DLX–Unterprogramm für die Multiplikation nach dem Verfahren der Ägyptischen Multiplikation schreiben. (a) Geben Sie das Unterprogramm mit folgenden Übergabeparametern an: R1, R2 enthalten die beiden zu multiplizierenden Zahlen, das Ergebnis wird in R3 übergeben. Nehmen Sie an, dass Multiplikand und Multiplikator positive Integerwerte sind, die keinen Überlauf produzieren. Das Unterprogramm soll nach dem Callee–Save–Prinzip gestaltet sein. (b) Geben Sie ein Codefragment an, dass es auch erlaubt negative Zahlen unter den Voraussetzungen in a. zu multiplizieren und kennzeichnen Sie die Stellen in a., wo dieses eingefügt werden soll. (c) Testen Sie das Unterprogramm in WinDLX.