2012-11-08 61 views
2

这是用于C代码的mips汇编代码。我使用Qtspim来模拟它,但是我收到上面标题的错误。尝试执行非指令

.text 

# j=$s0 , i=$t0 

main: 
     li $s0,5 # setting j to 5 
     li $t0,0 # setting i to zero 


loop: 
     slti $t1,$t0,8 
     bne $t1,1,Exit 
     add $s0,$s0,$t0 
     addi $t0,$t0,1 
     beq $s0,10,Exit 
     j loop 


Exit:  

这我想转换成汇编的C代码如下

j=5; 

for(t=0,i<8;i++){ 

    j=j+1; 
    if(j==10) 
     return; 
} 
+1

如何模拟器知道何时停止?是否有'hlt','brk'或类似的指令?你可以在Exit上做一个无限循环:j Exit; NOP; NOP; –

回答

1

汇编代码似乎确定。我想你的问题是你在QtSpim中启用了delayed branching。 这意味着分支后面的指令总是被执行,而不管分支采取的行动。

简单的修复方法是禁用延迟分支,或者在任何分支指令后添加NOP

在您的代码:

.text 
main: 
     li $s0,5 # setting j to 5 
     li $t0,0 # setting i to zero 


loop: 
     slti $t1,$t0,8 
     bne $t1,1,Exit 
     nop    # added a nop to prevent the addition when branch is taken 
     add $s0,$s0,$t0 
     addi $t0,$t0,1 
     beq $s0,10,Exit 
     j loop 
     nop    # added a nop to prevent executing unknown data after the unconditional jump 
Exit: 
     j Exit   # code added so we don't drop off executing after this point 
     nop 
+0

即使编辑完代码后仍然弹出错误,加上qtmips设置中未启用延迟分支 – Assasins

+1

@Fazlan:下一个猜测是您的退出标签没有任何事后,因此CPU将在“退出”后继续执行无意义的操作。 。我修改了上面的代码片段,在到达Exit后保留在那里。 – gusbro

+0

很棒..现在工作正常 – Assasins

9

如果您在“地址0X执行非istruction ...尝试”尝试在你的代码本月底将有问题的:

li $v0,10 
syscall 

PC计数器将始终为PC加上+4(因为指令是以4的倍数存储的),它会这样做,直到你不会说EXIT FROM PROGRAM。

是的,终止程序的过程是程序员的错误,因此您将编写一个退出系统调用以终止您的代码。

对于谁做8086的一些代码可以记得,有一个.EXIT例程返回程序到DOS的控制,所以这是一样的系统调用