フィボナッチ数を計算するRISC-Vアセンブリ
https://gyazo.com/a4afb5647df460d80eb7eabeebbcac9a
引き続きRISC-Vアセンブリの練習中。
関数呼び出しやスタック操作を試すため、フィボナッチ数を計算するプログラムを作成した。
code:fib.S
# fib(10) を計算する
.text
.globl main
main:
addi sp, sp, -16
sw ra, 0(sp)
sw s0, 4(sp)
sw s1, 8(sp)
sw s2, 12(sp)
addi s0, zero, 0
addi s1, zero, 1
addi s2, zero, 2
addi a0, zero, 10
jal fib
lw ra, 0(sp)
lw s0, 4(sp)
lw s1, 8(sp)
lw s2, 12(sp)
addi sp, sp, 16
ret
fib:
// ra, s3, s4 をスタックへ退避
addi sp, sp, -16
sw ra, 0(sp)
sw s3, 4(sp)
sw s4, 8(sp)
// n = 0 なら 0 を返す
beq a0, s0, fib_ret
// n = 1 なら 1 を返す
beq a0, s1, fib_1
addi s3, a0, -1
addi s4, a0, -2
// fib(n - 1)
addi a0, s3, 0
jal fib
add s3, a0, zero
// fib(n - 2)
addi a0, s4, 0
jal fib
add s4, a0, zero
// fib(n - 1) + fib(n - 2) を返す
add a0, s3, s4
j fib_ret
fib_1:
addi a0, s1, 0
j fib_ret
fib_ret:
// ra, s3, s4 をスタックから復元
lw ra, 0(sp)
lw s3, 4(sp)
lw s4, 8(sp)
addi sp, sp, 16
ret
ビルドして実行すると、10番目のフィボナッチ数の55が出力される
code:sh
$ riscv32-unknown-elf-gcc fib.S -o fib
$ spike /opt/riscv/pk/riscv32-unknown-elf/bin/pk fib
$ echo %?
55