i need to convert my code from stack pointer to only use frame pointer, how can i do so? i am very new to MIPS.
i have this recursion C code and its MIPS code below. i am using stack pointer , how can i change it to use frame pointer?
here is my C Code
int fact(int n)
{
if(n!=1)
return n*factorial(n-1);
}
int comb (int n, int k)
{
return fact (n) / fact (k) / fact (n - k);
}
here my MIPS code
comb:
sub $sp, $sp, 16
sw $ra , 0($sp)
sw $s0, 4($sp)
sw $a0, 8($sp)
sw $a1, 12($sp)
jal fact
move $s0, $v0
lw $a0, 12($sp)
jal fact
div $s0, $s0, $v0
lw $a0, 8($sp)
lw $a1, 12($sp)
sub $a0, $a0, $a1
jal fact
div $s0, $s0, $v0
move $v0, $s0
lw $ra, 0($sp)
lw $s0, 4($sp)
addi $sp, $sp, 16
jr $ra
I found @markgz's comments to be interesting. His link to Wikipedia includes the quote:
The frame pointer ($30) is optional and in practice rarely used except when the stack allocation in a function is determined at runtime, for example, by calling alloca().
I always kinda thoght that $fp
seemed superfluous, but I always used it anyway because that's how I was taught to do it.
Anyway, if you are still interested, here is how I used the frame pointer:
#save $ra $s0, $a0 on stack
addi $sp $sp -4
sw $fp 0($sp)
move $fp $sp
addi $sp $sp -12
sw $ra -4($fp)
sw $a0 -8($fp)
sw $s0 -12($fp)
...
#restore and shrink stack
lw $s0 -12($fp)
lw $ra -4($fp)
lw $fp 0($fp)
addi $sp $sp 16
jr $ra
So each time the stack is expanded, I use the stack-pointer to save the old value of the frame pointer, and then I restore the old value of the frame pointer when shrinking the stack.
Mostly I just copy and paste this code every time I write a new function.