Assembly 此MIPS/QtSPIM While循环代码有什么问题

Assembly 此MIPS/QtSPIM While循环代码有什么问题,assembly,mips,spim,Assembly,Mips,Spim,程序以预期输出运行,但出现以下错误 代码 .data .text .globl main main: addi $t0, $t0, 0 # i = 0 addi $t2, $0, 10 # n = 10 j WhileCond # goto WhileCond WhileLoop: li $v0, 1 # print_int move $a0, $t0 # $a0 = i (print i) add

程序以预期输出运行,但出现以下错误

代码

.data

.text
.globl main
main: 
  addi $t0, $t0, 0    # i = 0
  addi $t2, $0, 10    # n = 10
  j WhileCond         # goto WhileCond

  WhileLoop:
    li $v0, 1         # print_int
    move $a0, $t0     # $a0 = i (print i)
    addi $t0, $t0, 1
    syscall

  WhileCond:
    blt $t0, $t2, WhileLoop # if i < 10 goto WhileLoop

  j $ra
错误

Exception occurred at PC=0x00000000
  Bad address in text read: 0x00000000
Instruction references undefined symbol at 0x800001dc
  [0x800001dc] 0x143a0000  bne $1, $26, 0 [ok_pc-0x800001d8]
不会将
$t0
设置为0,而是保持不变。(
move$t0,$zero
)或(
addi$t0,$0,0
)都可以工作

您还确定系统调用中保留了
$t0
$t2


最后,代码中似乎没有出现您发布的错误。您是否有寄存器的堆栈跟踪/转储或任何其他可能有助于跟踪它的内容?

甚至无法汇编。j$ra不是有效的MIPS指令。你的意思是jr$ra。有了jr$ra,它在火星模拟器上运行良好(除了$ra没有赋值,跳转到$ra时崩溃)。这就是为什么我猜你会出现这个错误:异常发生在PC=0x00000000文本中的错误地址读取:0x00000000该行是必需的吗?要从main方法返回?您没有函数调用,因此在您的情况下不需要该行。如果您想将此代码用作函数,则需要该行,以及其他一些函数,如函数入口/出口协议(有关MIPS ABI的更多信息)。我也不会用j WhileCond,而是用b WhileCond。跳转通常用于远地址,分支用于近地址。AFAIK分支执行得更快。@m0skit0,我认为没有
b
命令。我认为,
beq$0,$0,WhileCond
会起作用,但它现在起作用了(看来,
j$ra
引起了问题……虽然我认为@m0skit0是对的,但它根本不应该起作用……)。我记得syscall可能不会保留一些变量。。。但到目前为止,它起了作用。。。如何解决此潜在问题?通过将其保存在堆栈上,将在中进行详细说明。很可能@m0skit0做对了,我不记得SPIMs的启动条件。
Exception occurred at PC=0x00000000
  Bad address in text read: 0x00000000
Instruction references undefined symbol at 0x800001dc
  [0x800001dc] 0x143a0000  bne $1, $26, 0 [ok_pc-0x800001d8]
addi $t0, $t0, 0    # i = 0