Verwenden von Frame-Pointer MIPS
muss ich meine konvertieren von code aus dem stack-pointer um nur mit der frame-pointer, wie kann ich das tun? ich bin ganz neu MIPS.
habe ich diese Rekursion C-code und dessen MIPS-code unten. ich bin mit stack-pointer , wie kann ich es ändern, frame-pointer?
hier ist mein 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);
}
hier meine 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich @markgz die Kommentare interessant zu sein. Seine link zu Wikipedia enthält das Zitat:
Ich immer ein bisschen thoght, dass
$fp
schien überflüssig, aber ich immer es sowieso, weil das ist, wie ich gelehrt wurde, es zu tun.Sowieso, wenn Sie noch interessiert sind, hier ist, wie ich den frame pointer:
Also jedes mal, wenn der stack erweitert ist, ich benutze den stack-pointer zu speichern, wird der alte Wert der frame-pointer, und dann ich wieder der alte Wert der frame-pointer, wenn Sie schrumpft der stack.
Meist habe ich Sie einfach kopieren und fügen Sie diesen code jedes mal, wenn ich Schreibe eine neue Funktion.
$ra
,$s0
und$a0
. Sie speichern könnte alle 32 Register, wenn Sie wollten.sw $a1, -16($fp)
Sollten Sie nie konvertieren MIPS-code zu verwenden, der Frame-Pointer anstelle der Stack-Pointer, denn das würde Sie verletzen, MIPS Aufruf-Konvention, und dein code würde aufhören zu arbeiten, mit anderen Menschen den code.
Den Frame-Pointer ist in der Regel nicht verwendet in der hand codiert, MIPS-assembler, weil der stack-pointer nicht ändern, der Wert während der Ausführung einer Funktion. In der Tat, Ihr eigener code ist korrekt codiert, so dass der stack-pointer niemals den Wert ändert.
Erweiterung auf Konrad Lindenbach Antwort:
Diese Weise ist viel einfacher zu Lesen und zu schreiben, ohne Einbußen bei der Instruktion Länge. Verwenden Sie diese Methode für die dynamische Zuweisung von Speicher zu, wie die Wiederherstellung snippet braucht nicht zu wissen, wie viel Daten entfielen auf den stack.