下面分享一下mips汇编语言里递归函数的代码,以斐波那契数列为例,如有错误请各位批评指正!
.text
main:
li $v0 5
syscall
sw $v0 0($sp) #把n存入栈顶
li $t0 0
sw $t0 -4($sp) #存入当前结果=0
li $s0 2 #s0是常数2
jal fbnq
end:
li $v0 1
lw $t0 -4($sp) #读取结果,然后打印
move $a0 $t0
syscall
li $v0 10
syscall
fbnq:
subi $sp $sp 12 #先移动指针
sw $ra 4($sp) #存入当前跳转位置(记住要先jal再存$ra才是jump的位置)
lw $t0 12($sp) #取出n
ble $t0 $s0 else #如果n<=2,跳转到else语句,为结果赋值1
subi $t0 $t0 1 #n-1
sw $t0 0($sp) #存n-1入栈
jal fbnq
lw $t1 -4($sp) #把算好的n-1的结果保存到n中备用
sw $t1 8($sp) #保存到n中
#继续算n-2
lw $t0 12($sp) #取出n
subi $t0 $t0 2 #n-2
sw $t0 0($sp) #存n-2入栈
jal fbnq
lw $t1 -4($sp) #把n-2的结果取出来
lw $t2 8($sp) #取出n-1算好的结果
add $t3 $t1 $t2 #相加,得到fbnq(n-1)+fbnq(n-2)
sw $t3 8($sp) #存到n中
lw $ra 4($sp)
addi $sp $sp 12
jr $ra #返回
else: #当n<=2的情况,直接赋值1
lw $ra 4($sp)
li $t1 1
sw $t1 8($sp)
addi $sp $sp 12
jr $ra