私は現在、risc-v で小さなプロジェクトを行っています。問題は、関数でこのようなことをすると、
foo:
...
lw a3, 4(sp)
srli a2, a2, 16
srli a4, a4, 16
add a0, a2, a4
ret
add a0, a2, a4 を実行すると、a2 と a4 の値も変化します。たとえば、add a0、a2、a4 をコメントアウトして実行すると、結果は a0 = 0x33333333、a2 = a4 = 0x00000000 になります。「add」行を追加すると、結果は a0 = ax000063e3、a3=0x123392c8、a4=0x00000d6e、a2 = 0x00005675 になります。
関数の最後のステートメントであっても、その上にあるレジスタの値も変更します。(a3のように)
risc-v について何か不足していますか? 順次実行されていませんか?
結果を0にする関数でも、
...
beq a1, zero, exit_loop
...
exit_loop:
add a0, zero, zero
j finish
...
finish:
addi sp, sp, 28
ret
しかし、これは 0x00000001 を返します。risc-v の基本的な部分を理解している場合は、お知らせください。ありがとう。