私はCでこの関数を持っています:
int func(int n0, int n){
if (n > 1){
int nFinal = func(n0, --n);
return (nFinal*nFinal) + n0;
}
return n0;
}
そしてそれをアセンブリでプログラムしたい。私はこのコードを持っています:
.data
.text
.globl func
func:
addi $29,$29, -4
sw $ra,0($29)
move $8,$4
move $9,$5
ble $9,1,fim
sub $9,$9,1
move $5,$9
jal func
move $4,$11
jal quadrado
add $11,$2,$8
j fim
quadrado:
mul $2,$4,$4
jr $31
fim:
lw $31,0($29)
move $2,$11
jr $31
ble
$4と$5で渡されたパラメーターがそれぞれ2と1である場合、プログラムが期待どおりに機能する命令に到達したことがわかります。ラベルにジャンプしfim
、スタックから戻りアドレスを復元して、戻り値をmain
関数に渡します。
問題は、パラメーター$5の値が未定義であるということです。任意の値にすることができます。そして、私のプログラムの問題は、私のmain
関数からのリターンアドレスが失われ、プログラムがそれに戻ることができないことだと思います。wenプログラムが命令に到達しjal func
、リターンアドレスが命令のmain
リターンアドレスに置き換えられたと思いjal func
ます。
どうすればこの問題を解決できますか?(コードを尋ねるのではなく、いくつかの指示だけを求めます)