Friedrich-Alexander-Universität Erlangen Wintersemester 2012 Computational Engineering I Übungsblatt 6 D. Fey∗, A. Schäfer†, S. Limmer‡ Abgabe 03.-06.12.2012 1 Assembler-Programmierung 1.1 Adressierungsmodi (6 Punkte) In Abbildung 1 sehen Sie eine mögliche Belegung dreier Register R1-R3 und eines Arbeitsspeichers, bestehend aus 8 Speicherzellen. Alle Werte sind im Dezimalsystem angegeben. Welche Werte würden nach Ausführung der folgenden Additionsanweisungen im Register R1 stehen? • Add R1 #6 (R3) • Add R1 R2 (R2) • Add R1 2(R1) #5 • Add R1 R1 (R1+R1) • Add R1 (4) (5) • Add R1 #3 (R3) Hinweise: Der Additionsbefehl ist im Format Add Ziel Op1 Op2. Die angegebenen Befehle sind nicht als Befehlsfolge zu betrachten. D.h., vor Ausführung eines jeden Befehls gilt immer die Speicherbelegung aus Abb. 1. Die Notationen für die Adressierungsmodi entsprechen denen aus Kapitel 2.3 des Vorlesungsskripts. Von Wortlängen o.Ä. kann abstrahiert werden. ∗ [email protected] [email protected] ‡ [email protected] † 1 Abbildung 1: Register- und Arbeitsspeicherbelegung. 1.2 Pseudo-Assembler (10 Punkte) Schreiben sie ein Assembler-Programm, welches zwei ganzzahlige Werte > 0, die im Speicher an den Adressen 0x1000 und 0x4000 gespeichert sind multipliziert und das Ergebnis nach 0x1000 in den Speicher schreibt. Folgende Befehle stehen zur Verfügung: (Beispiele in Klammern) load x y lädt den Inhalt der Speicherzelle y in das Register x. (load R1 0x0004) store x y speichert den Inhalt des Registers y in die Speicherzelle x. (store 0x0004 R1) add x y addiert zum Register x einen festen Wert y oder den Inhalt eines Registers y (add R1 20 oder add R1 R2). sub x y analog zu add, nur eben Subtraktion. cmp x y vergleicht x und y und setzt entsprechend ein Vergleichsbit. x und y können sowohl Register als auch Konstanten sein. (cmp R1 0) <label>: eine beliebige Zeichenkette, die eine Codezeile markiert zu der über einen Sprungbefehl gesprungen werden kann. (jump1:) je <label> Springt zu der Marke <label>, falls der letzte Vergleich wahr war ansonsten wird normal mit dem Code fortgefahren. Ob der letzte Vergleichs wahr oder falsch war, wird durch das Vergleichsbit angegeben. (je jump1) jmp <label> Springt in jedem Fall zu <label>. (jmp foobar) Das folgende Beispiel würde etwa die Adresse 0x2000 auf 5 setzen, sofern der Wert an der Adresse 0x3000 gleich 1 ist, ansonsten wird die Adresse 0x2000 auf 7 gesetzt: load R1 0x3000 load R2 5 cmp R1 1 2 1 Assembler-Programmierung je ende load R2 7 ende: store 0x2000 R2 1.3 MIPS-Assembler (15 Punkte) Schreiben Sie ein Programm für den MIPS-Assembler-Simulator MARS, welches die Fakultäten der Zahlen 1, ..., 10 berechnet und ausgibt. Die Fakultät einer Zahl n ∈ N ist definiert als: ( 1 falls n = 0 n! = n · (n − 1)! sonst Senden Sie Ihr Programm per E-Mail an [email protected]. de. Der MARS-Simulator und Beispiel-Programme sind verfügbar unter http://courses. missouristate.edu/KenVollmar/MARS/. Hinweis: Speichern Sie die berechneten Fakultäten in einem Array und geben Sie dieses nach der Berechnung mit Hilfe des Print-Syscalls aus. 3