我正在尝试学习RISCV汇编。我正在努力学习ISA,并实现一些R型、S型指令。但是,每当我尝试运行sw和lw指令时。它总是给我超出范围的错误地址,我不明白为什么。这是一个示例:
lw a0,40(zero)
addi a1,zero,1
addi a2,zero,1
beq a0,a1,SAVE
LOOP:
addi a1,a1,1
addi t1,a1,0
addi t2,a2,0
jal ra,MUL
add a2,zero,t0
bne a1,a0,LOOP
SAVE:
sw a2,44(zero)
jal x0,DONE
MUL:
andi t0,t0,0
LOOP_MUL:
add t0,t0,t2
addi t1,t1,-1
bne t1,zero,LOOP_MUL
jalr zero,ra,0
DONE:
add zero,zero,zero我得到一些类似这样的错误: D:\ctmt\BTL_RISCV\riscv1.asm第2行错误:0x00400004处的运行时异常:地址超出范围0x00000004。如果有人能给我解释一下为什么会发生这个bug,我将非常感激。
发布于 2021-06-01 22:58:59
地址超出范围适用于加载和存储指令。它告诉你指令的地址(因为这是硬件看到/知道的),以及你试图访问的地址。通常这是因为基址寄存器中的指针值不正确,但有时,指针值接近某物的末尾,立即值使其超过末尾。
你应该查看你正在使用的模拟器或环境的内存映射,它可能会告诉你哪些内存区域是合法的-它也可能支持重新配置内存映射。低内存(从0到2048左右的值)不能保证在许多系统上是合法的内存位置,但有时可以配置为合法的小内存模型,例如在嵌入式系统上。低内存被配置为非法的一个原因是捕获空指针取消引用,这是一个常见的软件错误(使用空指针)。
https://stackoverflow.com/questions/67791105
复制相似问题