作者skyhigh8988 (Aesthetic)
站内Programming
标题[问题] 费氏数列转MIPS
时间Sun Mar 6 12:12:51 2011
C 语言的程式码是这样
int fact(int n){
if(n<1)return(1);
else return (n*fact(n-1));
}
组合语言如下
fact: addi $sp $sp -8
sw $ra 4($sp)
sw $a0 0($sp)
slti $t0 $a0 1
beq $t0 $zero L1
addi $v0 $zero 1
addi $sp $sp 8
jr $ra
L1: addi $a0 $a0 -1
jal fact
lw $a0 0($sp)
lw $ra 4($sp)
addi $sp $sp 8
mul $vo $a0 $vo
jr $ra
------------------------------------------------------------------
我搞混的地方在於
到了L1里面的 jal fact
我记得jal是会把下一个指令的位址存在ra
也就是说会把 lw $a0 0($sp) 这一行的位址存在ra
於是跳到了fact里面
但是一进去就把ra ,a0 给存到stack里面了
然後又跳到L1 又回去fact几次後 终於来到了
L1里面的
lw $a0 0($sp)
然後
lw $ra 4($sp)
接着到最後一个ra
课本上好像说这个ra是要回到主程式的
但是ra不是在jal那边回到了fact
就把ra的值存为要到lw $ra 4($sp)
所以最後一个 jr ra
应该会回到lw $ra 4($sp)
不会结束阿
我一定有一些盲点在哪边= =
递回用组语写真的很烦人
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.117.15
1F:→ akasan:你的费氏数列怪怪的耶 61.60.218.62 03/06 12:28
2F:→ akasan:$ra 每次递回前都有存所以回得去主程式 61.60.218.62 03/06 12:30
3F:→ skyhigh8988:我自己想出来了 谢谢大家~ 140.116.117.15 03/06 13:01
4F:→ firejox:这是费氏还是阶乘... 210.60.107.233 03/15 18:46