5

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

2 回答 2

18

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

li $v0,10
syscall

pc 计数器将始终将 +4 添加到 pc(因为指令以 4 的倍数存储)并且它会这样做,直到您不会说 EXIT FROM PROGRAM。

是的,终止程序的过程是程序员的错,所以你将编写一个退出系统调用来终止你的代码。

谁在 8086 上写过代码,记得有一个 .EXIT 例程,将程序的控制权返回给 DOS,所以它与 syscall 相同

于 2012-12-15T20:50:23.987 回答
1

汇编代码似乎没问题。我猜你的问题是你在 QtSpim 中启用了延迟分支。这意味着无论分支采取何种操作,始终执行分支之后的指令。

简单的解决方法是禁用延迟分支,或者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
于 2012-11-08T13:37:00.883 回答