递归Fibonacci汇编MIPS代码

时间:2012-11-19 09:21:28

标签: assembly recursion mips fibonacci

我已经在模块编译器中为我的课程创建了一个代码生成器。它在MIPS汇编代码中生成代码,似乎工作正常(我测试过非常简单的程序和表达式)。 我测试了递归的Fibonacci程序,它目前永远循环。基本情况0和1正常工作。但是当我尝试使用fib(2)或更多时,它会保持循环。 不确定问题是什么,任何人都可以帮我找到它吗?

以下是代码:

main: 
move $fp $sp 
sw $ra 0($sp)
addiu $sp $sp -4 
sw $fp 0($sp) 
addiu $sp $sp -4 
li $a0 2 #testing comment
sw $a0 0($sp) 
addiu $sp $sp -4 
jal fib_entry 
lw $ra 4($sp) 
addiu $sp $sp 8 
lw $fp 0($sp) 
li $v0, 10 
syscall 
fib_entry: 
move $fp $sp 
sw $ra 0($sp)
addiu $sp $sp -4 
lw $a0 4($fp) 
sw $a0 0($sp) 
addiu $sp $sp -4 
li $a0 0 
lw $t1 4($sp) 
addiu $sp $sp 4 
beq $a0 $t1 thenBranch1
elseBranch1: 
lw $a0 4($fp) 
sw $a0 0($sp) 
addiu $sp $sp -4 
li $a0 1 
lw $t1 4($sp) 
addiu $sp $sp 4 
beq $a0 $t1 thenBranch2
elseBranch2: 
sw $fp 0($sp) 
addiu $sp $sp -4 
lw $a0 4($fp) 
sw $a0 0($sp) 
addiu $sp $sp -4 
li $a0 1 
lw $t1 4($sp) 
sub $a0 $t1 $a0 
addiu $sp $sp 4 
sw $a0 0($sp) 
addiu $sp $sp -4 
jal fib_entry 
sw $a0 0($sp) 
addiu $sp $sp -4 
sw $fp 0($sp) 
addiu $sp $sp -4 
lw $a0 4($fp) 
sw $a0 0($sp) 
addiu $sp $sp -4 
li $a0 2 
lw $t1 4($sp) 
sub $a0 $t1 $a0 
addiu $sp $sp 4 
sw $a0 0($sp) 
addiu $sp $sp -4 
jal fib_entry 
lw $t1 4($sp) 
add $a0 $a0 $t1 
addiu $sp $sp 4 
b endIf2 
thenBranch2: 
li $a0 1 
endIf2: 
b endIf1 
thenBranch1: 
li $a0 0 
endIf1: 
lw $ra 4($sp) 
addiu $sp $sp 12 
lw $fp 0($sp) 
jr $ra 

1 个答案:

答案 0 :(得分:2)

该代码存在各种问题。

  1. 您应该在<{1}} 之前递减$sp (尽管这只是按照惯例)
  2. 你应该在} 之前保存你修改它(这是常识;)
  3. MIPS通常使用寄存器来传递参数(但你可以使用 当然是构成你自己的约定)
  4. 你的堆栈处理过于复杂,至少在($sp)中它是不平衡的
  5. 建议从$fp返回,而不是使用main系统调用
  6. 在尝试生成一些代码之前,您当然应该能够编写和调试asm代码。

    给定输入结构类似于此C实现:

    main

    我希望有一个不太聪明的编译器来生成这样的代码:

    exit

    注意我故意不加优化。这种代码应该足够简单,可以生成。