.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 を使用しています。なぜそれが機能しなくなるのですか?ここで私のエラーは何ですか?
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
また、「終了」がラベルとしてマークされていることを確認する必要があります (その後にコロンを追加します)。
の後jal func
に、返さなければならないra
アドレスが含まれます。上書きします。その後、同じアドレスに戻り、同じアドレスに戻り、永遠にループします。func
jal func2
ra
func2
func1
func1
関数が別の関数を呼び出す場合は、ra
すべての呼び出しの前に保持し、すべての呼び出しの後、戻る前に復元する必要があります。