【发布时间】:2013-05-13 14:05:18
【问题描述】:
所以我有这个代码 计算阶乘(通常) 但在本例中,它计算 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
我的问题是 我不需要一个 JR L1 L2中的乘法后的命令? 递归是如何工作的? 它不需要某种方式来存储以前的数字吗? 我认为这是堆栈的工作,但在我看来,每次 该函数被称为之前存储的变量ars被覆盖。
ps 我不知道是否有人理解我的问题 对不起我的英语不好......
【问题讨论】:
-
fact做的第一件事是在堆栈上创建一组新的局部变量 (addiu $sp, $sp, -32)。