Wir studieren den MIPS-Assembler (ich denke, dass diese Frage allgemein für die Assembly gelten kann), und der Lehrer stellte uns den Frame-Zeiger vor.Was sind die Vorteile eines Frame Pointers?
addiu $sp, $sp, -8 ; alloc 2 words in the stack
sw $s0, 4($sp) ; save caller function $s0 value in the stack
sw $ra, ($sp) ; save the return address for the callee function
Und in der Funktion Epilog:
Wenn ich eine Funktion Prolog habe ich direkt den Stapelzeiger tun verwendet
move $v0, $0 ; set 0 as return value
lw $s0, 4($sp) ; pick up caller $s0 value from the stack
lw $ra, ($sp) ; pick up return address to return to the caller
addiu $sp, $sp, 8 ; dealloc the stack words I used
jr $ra ; return back to caller
Der Lehrer sagte, dass Rahmenzeiger verwendet, ist nützlich für uns Menschen, wenn wir Funktionen in der Montage schreiben:
addiu $sp, $sp, -12 ; alloc 3 words in the stack
sw $fp, 8($sp) ; save caller frame pointer in the stack
addiu $fp, $sp, 8 ; set $fp to the uppermost address of the activation frame
sw $ra, -4($fp) ; saving like the first example, but relative
sw $s0, -8($fp) ; to the frame pointer
Der Lehrer sagte auch, dass der Stapelzeiger manchmal anderen Speicherplatz zuweist und dass der Aktivierungsrahmen innerhalb der Funktion schwieriger ist, da wir darauf achten müssen. Mit Rahmenzeiger haben wir einen statischen Zeiger auf den Aktivierungsrahmen.
Ja, aber werde ich jemals müssen die Aktivierung innerhalb der Funktion verwenden, da es nur die gespeicherten Daten der Anruferfunktion enthält?
Ich denke, es macht nur Dinge schwieriger zu implementieren. Gibt es ein echtes praktisches Beispiel, bei dem der Rahmenzeiger für den Programmierer von großem Vorteil ist?
für viele Befehlssätze müssen Sie nicht einen Frame-Zeiger verwenden, im besten Fall erleichtert es den Debuggern des Compilers Autoren, die nicht wirklich eine gültige Entschuldigung ist, scheint mir eine Verschwendung eines Registers. GCC, etc. können Sie wählen, nicht einen Rahmenzeiger zu verwenden, nicht Code zu erstellen, der es verwendet, um diesen Overhead zu speichern. einige Standardeinstellungen mit einigen Standardeinstellungen ohne. Es macht die Offsets innerhalb der für diese Funktion festgelegten Funktion, Variable X ist immer fp-N für diese Funktion. Sie können X sp + M für die ganze Funktion machen, oder wenn die Funktion geht, können Sie sp nach Bedarf verschieben, um Platz zu sparen. –
Am Ende des Tages, was auch immer der Lehrer sagt, geht, für diese Klasse, die Klasse bestehen, zweifeln Sie alles und (wieder-) entdecken Sie es für sich selbst, um zu sehen, ob Sie es glauben oder nicht. War es nur etwas, um dem Lehrer die Benotung von Hausaufgaben zu erleichtern, oder wurde mir diese Programmierregel tatsächlich "besser" in gewisser Hinsicht gelehrt? Ich stimme zu, es macht es einfacher für Menschen, aber gleichzeitig Compiler oder Mensch, wenn Sie sp bewegen, um die gesamte Nutzung für die Funktion zu decken, ist es genauso einfach, ohne einen Rahmenzeiger. –
Versuchen Sie Folgendes: Definieren Sie eine C-Struktur in Ihrem Kopf mit 5 oder mehr Feldern. Weisen Sie Platz dafür im Stapel zu. Initialisiere es. Übergeben Sie seine Mitglieder an andere Funktionen als Parameter auf dem Stapel. Mach es mit und ohne Rahmenzeiger. –