RISC-V アセンブリ言語で n 番目のフィボナッチ数を計算するコードを作成しました。これには と の 2 つの部分がfib.s
ありruntest.s
、 の値をにロードし、n
をa0
呼び出しますfib
。 は、n 番目のフィボナッチ数を (再帰なしで) 計算し、結果をa0
それ自体にロードして返します。これが私のコードです:
.global fib # the runtest.s will give an a0 value as input n and call fib
fib:
li a1, 0 # This is a
li a2, 1 # This is b
li a3, 0 # This is c
li a4, 2 # This is i
li a6, 2 # dummy, just to check a0 with
ble a0, a6, cond1 # check if a0 <= 2
bgt a0, a6, head # if a0 > 2, proceed to loop
head: # start of loop
add a3, a1, a2 # Here I'm implementing the space optimized version of fibonacci series without recursion:
mv a1, a2 # for i in range(2, n+1): c = a + b; a = b; b = c; return b
mv a2, a3
addi a4, a4, 1
blt a4, a0, head
bge a4, a0, end # iterates n-1 times and goes to end
cond1:
li a0, 1 # if n==1 or n==2 return 1
li a7, 93
ecall
end:
mv a0, a2 # copying the value of a2 (which is b) to a0, since the testbench
li a7, 93 # runtest.s is setup that way.
ecall
そして、ここに私のテストベンチがあります(runtest.s
):
.global _start
_start:
# Load 'n' into a0 and call fib
# Test 1
li a0,1 # Check n'th Fib number
call fib
li a5,1 # Expected result
bne a0,a5,.FINISH
# Test 2
li a0,3
call fib
li a5,3
bne a0,a5,.FINISH
# Test 3
li a0,7
call fib
li a5,13
bne a0,a5,.FINISH
# Test 4
li a0,9
call fib
li a5,34
bne a0,a5,.FINISH
# Test 5
li a0,20
call fib
li a5,6765
bne a0,a5,.FINISH
# Test 6
li a0,30
call fib
li a5,832040
bne a0,a5,.FINISH
# Finished tests
li a5,0 # All passed
.FINISH:
mv a0, a5
li a7, 93
ecall
このコードを実行するたびに、戻り値が 1 しか返されません。誰かがこれのエラーを指摘できますか? また、同じロジックを実装するためのより良い方法があれば、それも教えてください。