だから私は(一般的に)階乗を計算するこのコードを持っていますが、この例では10の階乗を計算します
.data 0x10008000
.word 10
.word 1
.word 0
.ascii "The factorial of 10 is %d \n"
.text
.globl main
main:
addi $sp, $sp, -32
sw $ra, 20($sp)
sw $fp, 16($sp)
addiu $fp, $sp,28
lw $a0, 0($gp)
jal fact
...
lw $ra, 20($sp)
lw $fp, 16($sp)
addiu $sp, $sp, 32
jr $ra
fact:
addiu $sp, $sp, -32
sw $ra, 20($sp)
sw $fp, 16($sp)
addiu $fp, $sp, 28
sw $a0, 0($fp)
lw $v0, 0($fp)
lw $t0, 4($gp)
slt $t1,$v0,$t0
bne $t0, $t1, L2
addi $v0, $v0, 1
jr L1
L2:
lw $v1, 0($fp)
addi $v0, $v1, -1
sw $v0, 8($gp)
lw $a0, 8($gp)
jal fact
lw $v1, 0($fp)
mul $v0, $v0, $v1
L1:
lw $ra, 20($sp)
lw $fp, 16($sp)
addiu $sp, $sp, 32
jr $ra
私の問題は、これは L2 での乗算の後に jr L1 コマンドを必要としないということですか? 再帰はどのように機能しますか? 以前の数値を保存する方法は必要ありませんか? これはスタックの仕事だと思いますが、関数が呼び出されるたびに、以前に保存された変数が上書きされるように思えます。
PS誰かが私の問題を理解したかどうかわかりません。下手な英語で申し訳ありません...