«(ошибка) при попытке записи на неверный адрес памяти» При попытке сохранить указатель стека - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь изучить 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

...