見出し画像

素数を求めるアセンブラコードを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
合っているようです!

所感

やると決めたことは、やりましょう。
それが自信です。

(夜中に何を・・)

いいなと思ったら応援しよう!