MIPS编写斐波那契递归

刚学汇编,记录一下

C语言版:

int fib(int n)
{
	if(n == 1 || n == 2)
		return 1;
	else 
		return fib(n - 1) + fib(n - 2);
}

mips汇编语言:

   .text
        .globl main
main:

	addi $s0, $0, 16
	addi $a0, $0, 8
	jal fib
	add $s6, $v0, $0

     li $v0,10
     syscall       #退出	


fib:
	addi $sp, $sp, -12
	sw $a0, 8($sp)
	sw $ra, 4($sp)
	sw $s0, 0($sp)
	addi $t0, $0, 2
	addi $t1, $0, 1		
	beq $a0, $t0, if		#if(n == 1 || n == 2)
	beq $a0, $t1, if
	#else
    addi $a0, $a0, -1		#func(n - 1)
	addi $sp, $sp, -4		
	sw $a0, 0($sp)			#存a0
	jal fib
	add $s0, $v0, $0
	lw $a0, 0($sp)			#取a0
	
	sw $s0, 0($sp)			#  存s0----func(n - 1)的返回值
	addi $a0, $a0, -1		#func(n - 2)
	jal fib
	lw $s0, 0($sp)			#  取s0
	addi $sp, $sp, 4	
	add $v0, $v0, $s0		#func(n)的返回值
	
	lw $s0, 0($sp)
	lw $ra, 4($sp)
	lw $a0, 8($sp)
	addi $sp, $sp, 12
	jr $ra
if:
	addi $sp, $sp, 12	#回收栈空间
	addi $v0, $0, 1		#return 1
	jr $ra

程序计算fib(8)的值,并保存到s6里面,另外func里面使用了s0,因此需要保存到栈里面。下面是结果,s6中结果为0x15=21,并且s0里面保存的值并没有被fib修改
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210408202554455.png

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zh³~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值