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で非istructionを実行しようとしています...」で問題が発生した場合は、コードの最後に次のように追加してみてください。

li $v0,10
syscall

PCカウンターは常にPCに+4を追加し(命令は4の倍数で格納されるため)、プログラムからの終了を言わなくなるまでこれを行います。

はい、プログラムを終了する手順はプログラマーの責任です。そのため、コードを終了するためにexitsyscallを記述します。

8086でコードを実行した人は、プログラムの制御をDOSに戻す.EXITルーチンがあったことを思い出すことができるので、システムコールと同じです。

于 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 に答える