88 lines
3.4 KiB
NASM
88 lines
3.4 KiB
NASM
######################################################################################
|
||
# 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 ###########################
|
||
|
||
|
||
|
||
|
||
|
||
|