所以我有這樣的代碼 其計算階乘(一般) 但在這個例子中計算的10MIPS彙編:理解遞歸
.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如果任何人都瞭解我的問題 我爲我的英文不好對不起,我不知道......
「事實」的第一件事是在堆棧上創建一組新的局部變量('addiu $ sp,$ sp,-32')。 – 2013-05-12 19:56:27