Я пытаюсь изучить RISC-V в среде Jupiter (risc32), и я столкнулся с проблемой, требующей написать рекурсивную программу с RISC-V. Кажется, я не могу заставить команду sw работать, поскольку она всегда выдает ошибку: неверный адрес
Я пробовал разные смещения, разные регистры и т. Д., Кажется, ничего не работает
.globl __start
.rodata
msg_input: .string "Enter a number: "
msg_result: .string "The result is: "
newline: .string "\n"
.text
__start:
# prints msg_input
li a0, 4
la a1, msg_input
ecall
#read from standard input
li a0, 5
ecall
#initialize stack
addi x31, x0, 2
addi sp, x0, 800
mv x5, a0
jal x1, recfunc
mv t0, x5
recfunc:
addi sp, sp, -8
sw x1, 0(sp)
bge x5, x31, true
lw x1, 0(sp)
addi x10, x0, 1
addi sp,sp, 8
jalr x0, 0(x1)
true:
div x5, x5, x31
jal x1, recfunc
lw x1, 0(sp)
addi sp,sp,8
mul x10, x10, x31
addi x10, x10, 1
jalr x0, 0(x1)
result:
#prints msg_result
li a0, 4
la a1 msg_result
ecall
#prints the result in t0
li a0, 1
mv a1, t0
ecall
#ends the program with status code 0
li x5, 10
ecall
Ошибка возникает при:
sw x1, 0 (x2)
(ошибка) при попытке записи на недопустимый адрес памяти 0x00000318