# writeln # Argument entier dans a0 # Affiche son argument suivi de newline .data nl: .asciiz "\n" .text .globl writeln writeln: # l'argument est dans a0 li $v0, 1 # le numéro de print_int syscall # appel système li $v0, 4 # la primitive print_string la $a0, nl # la chaîne "\n" syscall jr $ra # saut à l'adresse ra # read # Lit un entier et le renvoie dans v0 .globl read read: li $v0, 5 # le numéro de read_int syscall # lit un entier et le place dans v0 jr $ra # fib # Argument entier dans a0, retour dans v0 .globl fib fib: ble $a0, 1, fib1 # a0 <= 1 ? sub $sp, $sp, 8 # Réserver de l'espace en pile sw $ra, 0($sp) # Sauvegarder l'adresse de retour sw $a0, 4($sp) # Sauvegarder n sub $a0, $a0, 1 # n - 1 jal fib # place fib(n-1) dans v0 lw $a0, 4($sp) # Récupérer n sw $v0, 4($sp) # Sauvegarder le résultat sub $a0, $a0, 2 # n - 2 jal fib # place fib(n-2) dans v0 lw $v1, 4($sp) # Récupérer le résultat précédent add $v0, $v0, $v1# Additionner lw $ra, 0($sp) # Récupérer l'adresse de retour add $sp, $sp, 8 # Libérer l'espace en pile jr $ra fib1: li $v0, 1 # Renvoyer 1 jr $ra # Programme principal .globl __start __start: jal read move $a0, $v0 jal fib move $a0, $v0 jal writeln li $v0, 10 # Exit syscall