Jus*_*mes 2 assembly mips spim qtspim
我需要将我的代码从堆栈指针转换为仅使用帧指针,我该怎么办?我对MIPS很新.
我有这个递归C代码及其下面的MIPS代码.我正在使用堆栈指针,如何更改它以使用帧指针?
这是我的C代码
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);
}
Run Code Online (Sandbox Code Playgroud)
这是我的MIPS代码
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
Run Code Online (Sandbox Code Playgroud)
我发现@markgz的评论很有意思.他与维基百科的链接包括引用:
帧指针($ 30)是可选的,实际上很少使用,除非在运行时确定函数中的堆栈分配,例如,通过调用alloca().
我总是觉得这$fp
似乎是多余的,但无论如何我总是使用它,因为这就是我被教导的方式.
无论如何,如果你仍然感兴趣,这是我如何使用帧指针:
#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
Run Code Online (Sandbox Code Playgroud)
所以每次扩展堆栈时,我都使用堆栈指针来保存帧指针的旧值,然后在收缩堆栈时恢复帧指针的旧值.
大多数情况下,我每次编写新函数时都会复制并粘贴此代码.