![見出し画像](https://assets.st-note.com/production/uploads/images/150180596/rectangle_large_type_2_bc75d5dc326a456ec2a67b7bf4c4694e.png?width=1200)
素数を求めるアセンブラコードをRISC-V(RV32IM)でシミュレーション実行
背景
前回まで
コード
アセンブラコード
.section .data
# データセクションは必要ない場合もあるので、ここでは空です
.section .text
.global _start
_start:
# レジスタ初期化
li x11, 0x02 # x11 = 2 (テストする数)
li x12, 0x02 # x12 = 2 (除数の初期値)
li x13, 0x00 # x13 = 素数フラグ (0 = 素数, 1 = 素数でない)
li x14, 0x64 # x14 = 上限 (100)
li x15, 0x00 # x15 = メモリ書き込み用のオフセット (0x00)
next_number:
li x12, 0x02 # 除数を2にリセット
li x13, 0x00 # 素数フラグをリセット
check_prime:
# 除数がテストする数未満の間、割り算を繰り返す
mv x16, x11 # x16 = x11 (割られる数)
calc_remainder:
beq x16, x0, not_prime # 割り切れた場合は素数ではない
blt x16, x12, end_check # 余りが割る数より小さくなったら次の数をチェック
sub x16, x16, x12 # x16 = x16 - x12 (余りを計算)
j calc_remainder # 繰り返し
not_prime:
li x13, 0x01 # 素数フラグを1に設定 (素数でない)
end_check:
addi x12, x12, 1 # 除数を1増やす
blt x12, x11, check_prime # 除数がテストする数未満なら再チェック
beq x13, x0, store_prime # フラグが0なら素数なのでメモリに保存
addi x11, x11, 1 # 次の数をチェック
bge x11, x14, end_program # 100までチェックしたら終了
j next_number # 次の数をチェック
store_prime:
# メモリアドレスに素数を書き込む (1バイト単位)
lui x4, 0x0001 # 上位ビットを設定 (メモリのベースアドレス)
add x4, x4, x15 # x15をアドレスに加える
sb x11, 0(x4) # 素数をメモリに1バイトで書き込む
addi x15, x15, 1 # 次のメモリアドレスへ (1バイト進める)
addi x11, x11, 1 # 次の数をチェック
bge x11, x14, end_program # 36までチェックしたら終了
j next_number # 次の数をチェック
end_program:
# 無限ループでプログラムを停止
loop_end:
j loop_end # 無限ループ
実行
run_sim.sh
riscv64-unknown-elf-as -march=rv64im -o program.o program.s
riscv64-unknown-elf-ld -T linker.ld -o program.elf program.o
riscv64-unknown-elf-objcopy -O verilog program.elf program.hex
iverilog -o tb_RV32IM.vvp tb_RV32IM.v RV32IM.v
vvp tb_RV32IM.vvp
実行結果
% ./run_sim.sh
Memory Dump at time 1000020:
mem[00001000] = 3
mem[00001001] = 5
mem[00001002] = 7
mem[00001003] = 11
mem[00001004] = 13
mem[00001005] = 17
mem[00001006] = 19
mem[00001007] = 23
mem[00001008] = 29
mem[00001009] = 31
mem[0000100a] = 37
mem[0000100b] = 41
mem[0000100c] = 43
mem[0000100d] = 47
mem[0000100e] = 53
mem[0000100f] = 59
mem[00001010] = 61
mem[00001011] = 67
mem[00001012] = 71
mem[00001013] = 73
mem[00001014] = 79
mem[00001015] = 83
mem[00001016] = 89
mem[00001017] = 97
mem[00001018] = x
mem[00001019] = x
100までの素数は、2, 3, 5, 7, 11, 13, 17, 19, 23, 29,31, 37, 41, 43, 47, 53, 59, 61, 67, 71,73, 79, 83, 89, 97
合っているようです!
所感
やると決めたことは、やりましょう。
それが自信です。
(夜中に何を・・)