###################################################################################### # 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ü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 ###########################