1

私は現在、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 の基本的な部分を理解している場合は、お知らせください。ありがとう。

4

0 に答える 0