[問題] 費氏數列轉MIPS
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
→
03/06 12:28, , 1F
03/06 12:28, 1F
→
03/06 12:30, , 2F
03/06 12:30, 2F
→
03/06 13:01, , 3F
03/06 13:01, 3F
→
03/15 18:46, , 4F
03/15 18:46, 4F
Programming 近期熱門文章
PTT數位生活區 即時熱門文章