Übungsblatt 6

Werbung
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
Herunterladen