2013-03-12 30 views
1

我正在關注MIPS ASM的初學者指南。(ASM)使用更少寄存器的Fibonacci函數?

的問題是:

編寫程序作爲一個計數循環時斐波納契數列的第一 100而言已經計算終止。 使用當前期限的寄存器 以及上一期的註冊表。每個執行循環計算一個新的當前項,然後將舊的當前項複製到前一個項寄存器。

似乎解決方案應該只使用2個寄存器;以前和當前值。另外還有2個計數器和'101'(書中說在註冊表中使用101代表beq指令)

是否有可能從我的解決方案中刪除「總和」寄存器? 我是一個初學者程序員,這是我的想法。

這是錯誤的,因爲它不是計算機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 
+0

邁克爾已經給出很好的答案,只是想指出的是,你只需要一個寄存器該計數器也是,如果你從100開始,每個循環遞減一次並使用bltz,那麼你總共只有3個寄存器。 – 2013-03-12 18:30:31

回答

1

是的,這是可能的:

addu $9,$9,$8 # current += prev 
sub $8,$9,$8 # prev = current - prev (== old current) 
相關問題