5
.data

.text
    .globl __start
    __start:

main:
    jal func
    sll $0,$0,0
    j end

func:
   jal func2
   sll $0,$0,0  
   jr $ra
   sll $0,$0,0

func2:
    jr $ra
    sll $0,$0,0

end

私は PCSpim を使用しています。なぜそれが機能しなくなるのですか?ここで私のエラーは何ですか?

4

3 に答える 3

5

func でジャンプとリンクを実行すると、func2 関数が実行され、リターン アドレス ($ra) がジャンプとリンク (PC+4) の直後の行に設定されます。func2 サブルーチン内では、戻りアドレス (func の sll) に保存されている位置にすぐに戻ります。シフトの後、無限ループにつながる func の sll である戻りアドレスに再びジャンプしようとしています。

つまり、連続してサブルーチン呼び出しを行う場合、サブルーチン呼び出しの前後で、それぞれリターン アドレスを保存および復元する必要があります。

foo:
    #do some functiony stuff
    mov    $s0, $ra    #save return address into s0
    jal    bar         #do the bar subroutine
    mov    $ra, $s0    #restore return address that was saved into s0
    jr     $ra         #jump there

bar:
    #do some more functiony stuff
    jr     $ra

また、「終了」がラベルとしてマークされていることを確認する必要があります (その後にコロンを追加します)。

于 2013-03-29T12:13:48.470 に答える
3

の後jal funcに、返さなければならないraアドレスが含まれます。上書きします。その後、同じアドレスに戻り、同じアドレスに戻り、永遠にループします。funcjal func2rafunc2func1func1

関数が別の関数を呼び出す場合は、raすべての呼び出しの前に保持し、すべての呼び出しの後、戻る前に復元する必要があります。

于 2013-03-29T12:14:34.920 に答える