Dokumente und Mars-Simulator
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
######################################################################################
|
||||
# Liest eine natuerliche Zahl n <= 25 ein und gibt die ersten n Fibonacci-Zahlen aus #
|
||||
## Leicht modifizierte Version der Datei Fibonacci.asm, die auf der MARS Website ##
|
||||
#### unter 'Tutorial materials' zum Download zur Verfuegung steht: ####
|
||||
##### http://courses.missouristate.edu/KenVollmar/mars/tutorial.htm #####
|
||||
######################################################################################
|
||||
|
||||
.data
|
||||
fibs: .word 0:25 #'array' fuer die berechneten Fibonaccizahlen
|
||||
size: .word 25 # Groesse dieses 'arrays'
|
||||
prompt: .asciiz "\nBitte geben Sie eine Zahl (n <= 25) an, n = "
|
||||
.text
|
||||
main:
|
||||
la $s0, fibs # Adresse des 'arrays' laden
|
||||
la $s5, size # Adresse der size Variable laden
|
||||
lw $s5, 0($s5) # Arraygroesse laden
|
||||
input:
|
||||
# Einlesen und Ueberpruefen von n
|
||||
la $a0, prompt # Adresse des Strings laden
|
||||
li $v0, 4 # der Wert 4 fuer den syscall bedeutet print string
|
||||
syscall # String ausgeben
|
||||
li $v0, 5 # der Wert 5 fuer den syscall bedeutet: read integer
|
||||
syscall # n einlesen, gelesener Wert steht in $v0
|
||||
|
||||
bgt $v0, $s5, input # Falls der eingegebene Wert groesser als 25 ist, neu einlesen
|
||||
blt $v0, $zero, input # Falls der eingegebene Wert kleiner Null ist, neu einlesen
|
||||
|
||||
add $s5, $zero, $v0 # korrekt eingelesenen Wert in $s5 speichern
|
||||
|
||||
# Da die ersten beiden Fibonacci-Zahlen 1 sind, wird 1 direkt gespeichert
|
||||
li $s2, 1
|
||||
sw $s2, 0($s0) # F[0]=1
|
||||
sw $s2, 4($s0) # F[1]=1
|
||||
addi $s1, $s5, -2 # dient als Counter fuer die Schleife, laeuft n-2 mal
|
||||
loop:
|
||||
# Schleife zur Berechnung der Fibonaccizahlen
|
||||
lw $s3, 0($s0) # Wert aus F[x-2] holen
|
||||
lw $s4, 4($s0) # Wert aus F[x-1] holen
|
||||
add $s2, $s3, $s4 # F[x] = F[x-2] + F[x-1]
|
||||
sw $s2, 8($s0) # F[x] speichern
|
||||
addi $s0, $s0, 4 # Inkrementieren der Adresse
|
||||
addi $s1, $s1, -1 # Dekrementieren des Counters
|
||||
bgtz $s1, loop # Wiederholen der Schleife loop, solange $s1>0
|
||||
|
||||
# Nach der Schleife liegen die Fibonacci-Zahlen vor und muessen noch ausgegeben werden
|
||||
la $a0, fibs # Erster Parameter fuer die print Funktion ist das gefuellte array
|
||||
add $a1, $zero, $s5 # Zweiter Parameter ist n (gespeichert in $s5)
|
||||
jal print # Aufruf des Unterprogramms print
|
||||
|
||||
# exit
|
||||
li $v0, 10
|
||||
syscall
|
||||
|
||||
############ Unterprogramm zur Ausgabe der berechneten Fibonacci-Zahlen #########################
|
||||
|
||||
.data
|
||||
space: .asciiz " " # Leerstelle, die zwischen den Zahlen eingefuegt wird
|
||||
message: .asciiz "\nDie Fibonacci-Zahlen sind: \n"
|
||||
.text
|
||||
print:
|
||||
add $t0, $zero, $a0 # Startadresse des arrays f<EFBFBD>r Ausgabe
|
||||
add $t1, $zero, $a1 # counter
|
||||
la $a0, message # Adresse des Strings 'message' laden
|
||||
li $v0, 4 # Der Wert 4 fuer den syscall bedeutet print string
|
||||
syscall # Ausgabe des Strings
|
||||
loop2:
|
||||
# Schleife zur Ausgabe der Zahlen
|
||||
lw $a0, 0($t0) # Laden der aktuellen Fibonaccizahl
|
||||
li $v0, 1 # der Wert 1 fuer den syscall bedeutet: print integer
|
||||
syscall # Ausgabe der Zahl
|
||||
la $a0, space # Laden der Adresse des Leerstellenstrings
|
||||
li $v0, 4 # Der Wert 4 fuer den syscall bedeutet: print string
|
||||
syscall # Leerstelle ausgeben
|
||||
|
||||
addi $t0, $t0, 4 # Inkrementieren der Adresse der auszugebenden Daten
|
||||
addi $t1, $t1, -1 # Dekrementieren des counters
|
||||
bgtz $t1, loop2 # Wiederholen der Schleife loop2, solange $t1>0
|
||||
|
||||
jr $ra # Ruecksprung zu main
|
||||
|
||||
############## Ende des Unterprogramms zur Ausgabe der Fibonacci-Zahlen ###########################
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user