FIBO C CODE MIPS
Salut les gars je suis en train de traduire mes fibonacci c code pour code assembleur MIPS, cependant, lorsque je lance le code MIPS à mon MIPS simulateur, il ne semble pas à la fin.
Code C:
int fibo(int n)
{
if(n<2) return 1;
else f(n-1)+f(n-2);
}
int main()
{
fibo(5);
}
Assemblée De Code:
main: addi $sp, $sp, -4
sw $ra, 0($sp)
addi $a0, $zero, 5
jal fibo;
lw $ra, 0($sp)
addi $sp, $sp, 4
fibo: addi $sp, $sp, -12
sw $s0, 0($sp)
sw $s1, 4($sp)
sw $ra, 8($sp)
slti $t0, $a0, 2
beq $t0, $zero, ELSE
addi $v0, $zero, 1
jr $ra
ELSE: addi $s0, $a0, 0
addi $a0, $a0, -1
jal fibo;
addi $s1, $v0, 0
addi $a0, $s0, -2
jal fibo
add $s1, $s1, $v0
j EXIT
EXIT: lw $s0, 0($sp)
lw $s1, 4($sp)
lw $ra, 8($sp)
addi $sp, $sp, 12
jr $ra
Étape à travers le
fibo
de routine dans le simulateur pour voir où les choses commencent à aller mal.OriginalL'auteur user3489500 | 2014-04-20
Vous devez vous connecter pour publier un commentaire.
Quelques questions ici.
Tout d'abord, votre
main
fonction était absent de résiliation dejr $ra
, ce qui signifie quemain
est tombée dansfibo
après son exécution.Deuxième, dans votre
if
déclaration, où vous retournez1
, vous appelezjr $ra
directement, ce qui signifie que la pile va non restauré. J'ai échangé avec un appel àj EXIT
.Enfin, à la fin de votre autre vous ajoutez
f(n-1)
etf(n-2)
en$s1
. Ce registre doit être$v0
que vous avez l'intention de retourner à ce résultat.Fixe code est comme suit:
OriginalL'auteur Konrad Lindenbach
Voici mon code pour le même,mais il est écrit dans RISC-V
OriginalL'auteur JEETU KUMAR
En plus de la réponse de Konrad (https://stackoverflow.com/a/23185991/3729904), j'ai remarqué qu'il y a une erreur dans votre algorithme. Si n<2 fib algorithme doit retourner n au lieu de 1.
Cela peut être corrigé en changeant la ligne:
dans:
OriginalL'auteur Matteo Manzali