.data
.lcomm i,4 # Entier pour stocker la valeur acquise par le scanf
format: .string "%d\n" # Format d'acquisition et d'affichage
.text
.global main
main: push %ebp # Sauvegarde du base pointer de l'appelant
movl %esp,%ebp # Le base pointer prend la valeur du stack pointer
pushl $i # On place dans la pile l'adresse du paramètre pour que scanf le modifie
pushl $format # On transmet également le format de la chaine (un int)
call scanf
add $8,%esp # On dépile les parametres, i a la valeur entrée par l'utilisateur
pushl i # On transmet la valeur du paramètre
subl $4,%esp # Allocation des 4 octets dans la pile pour le retour (entier)
call fibo
movl (%esp),%eax # esp contient l'adresse du résultat de fibo, on met ce dernier dans i
add $8,%esp # On dépile le paramètre et le retour de fibo
pushl %eax # On place la valeur de retour de fibo dans la pile
pushl $format # On transmet également le format de la chaine
call printf
add $8,%esp # On dépile les paramètres
leave # et c'est fini
ret
fibo: pushl %ebp # Sauvegarde du base pointer de l'appelant
movl %esp,%ebp # Le base pointer prend la valeur du stack pointer
pushal # Sauvegarde de tous les registres
movl 12(%ebp),%eax # On récupère le paramètre entier passé à fibo, dans eax
cmpl $0,%eax # Si param = 0, on renvoie 0 (jump à 'zero')
je zero
cmpl $1,%eax # Si param = 1, on renvoie 1 (jump à 'un')
je un
subl $1,%eax # Dans les autres cas, on soustrait 1 au pramètre pour calculer fibo(n-1)
pushl %eax # On place param-1 dans la pile
subl $4,%esp # On rèserve de la place pour le retour
call fibo # Appel récursif de fibo
movl (%esp),%ebx # Le résultat est à l'adresse de la pile indiquée par esp, on le met dans ebx
subl $1,%eax # On fait pareil pour calculer fibo(n-2)
pushl %eax
subl $4,%esp
call fibo
movl (%esp),%eax # Le résultat est dans eax
addl %ebx,%eax # On ajoute les deux résultats
movl %eax,8(%ebp) # On range eax dans l'espace alloué dans la pile avant l'appel de fibo
jmp fin # On saute à la fin de fibo
zero: movl $0,8(%ebp) # Si param = 0, on range 0 dans l'espace alloué dans la pile pour le retour de fibo
jmp fin # On saute à la fin de fibo
un: movl $1,8(%ebp) # Si param = 1, on renvoie 1
fin: popal # On restaure les registres à leur état précédant l'appel de fibo
leave # Fin de fibo
ret
|