尝试执行非指令

时间:2012-11-08 13:28:55

标签: assembly mips

这是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;
}

2 个答案:

答案 0 :(得分:11)

如果您遇到“尝试在地址0x处执行非istruction ...”的问题,请尝试在代码末尾添加:

li $v0,10
syscall

pc计数器将始终向电脑添加+4(因为指令以4的倍数存储)并且它将执行此操作,直到您不说“退出程序”。

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

对于谁在8086中做了一些代码可以记住有一个.EXIT例程将程序的控制权返回给DOS,所以它与syscall相同

答案 1 :(得分: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