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