所以我有这个计算阶乘的代码(通常),但在这个例子中它计算了 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 我不知道是否有人理解我的问题我很抱歉我的英语不好......