(ASM)Fibonacci函数使用更少的寄存器?

时间:2013-03-12 18:07:41

标签: assembly mips

我正在关注MIPS ASM的初学者指南。

问题是:

  

将程序写为计数循环,在第一个循环时终止   已经计算了斐波那契数列的100个项。 使用注册表   当前任期和前一任期的登记册。每   执行循环计算一个新的当前术语,然后复制   旧的当前期限到上一期的注册。

似乎解决方案应该只使用2个寄存器;先前和当前价值。另有2个用于计数器和'101'(该书说在登记册中使用101用于beq指令)

我可以从我的解决方案中删除'sum'寄存器吗? 我是一名初学程序员,这让我大吃一惊。

这是错误的,因为它不是计算机1,1,3,5,8 ...... 相反,它计算1,3,5,8。按照本书的方法我不知道如何计算机'1'两次。

我的解决方案,基于以下问题:

## fibonacci series ##
# $7=sum    $8=prev     $9=current  $10=counter     $11=101 #
.text
main:

ori $7,$0,0     # init sum 0
ori $8,$0,0     # init prev 0
ori $9,$0,1     # init current 1
ori $10,$0,0        # init counter 0
ori $11,$0,101  # init 101

loop:
beq $10,$11,exit
addu $7,$8,$9       # sum = prev+current
or $8,$0,$9         # copy old current to prev
or $9,$0,$7         # copy sum to new current
addiu $10,$10,1    # counter+1
j loop               # go to loop
sll $0,$0,0

exit:
j exit
sll $0,$0,0        # exit

1 个答案:

答案 0 :(得分:1)

是的,有可能:

addu $9,$9,$8    # current += prev
sub  $8,$9,$8    # prev = current - prev  (== old current)