Frame Pointer Erklärung

28

In der MIPS-Assembly gibt es ein Register für den Stapelzeiger und ein anderes Register für den Rahmenzeiger. Was ist der Rahmenzeiger und wozu dient er? Wie unterscheidet es sich vom Stapelzeiger?

qwaserdftyghuijkiii
quelle
1
Welche Recherchen haben Sie bereits durchgeführt - und wie gut sind Sie mit den Begriffen vertraut? Für welches System ist das gedacht (verschiedene Systeme haben unterschiedliche Terminologie)?
Ich möchte mich nur mit Frame Pointer (Mips Assembly) vertraut machen. Ich verstehe nicht, wie es hilft, warum wir es brauchen? Vielen Dank
qwaserdftyghuijkiii

Antworten:

44

In der MIPS-Assembly zeigt der Stapelzeiger auf den oberen Bereich des Stapels. Wenn Sie Speicherplatz auf dem Stapel zuweisen, zeigt der Stapelzeiger ($ sp) auf den freien Speicher.

Beim Aufrufen einer Unterroutine in der MIPS-Assembly (Register waren in jenen Tagen sehr beliebt - registergestützte Parameter, wenn sie nicht konventionell waren) werden die Parameter in den Stapel geschrieben und anschließend der Stapelzeiger vorgerückt.

Zu Beginn der Methode kann ein Parameter einen Offset von haben 16($sp). Wenn jedoch Variablen auf dem Stapel abgelegt werden, bewegt sich der Stapelzeiger und derselbe Parameter befindet sich möglicherweise 24($sp)stattdessen auf. Dies kann den Code etwas verwirren.

Der Rahmenzeiger ($ fp) zeigt auf den Anfang des Stapelrahmens und bewegt sich für die Dauer des Unterprogrammaufrufs nicht. Dies zeigt auf die Basis des Stapelrahmens, und die Parameter, die an das Unterprogramm übergeben werden, bleiben relativ zum Rahmenzeiger an einer konstanten Stelle.

Beachten Sie, dass der Frame-Zeiger mit Subroutinenaufrufen, die ihn ändern, gespeichert und wiederhergestellt werden muss.

Weitere Lektüre:


quelle
Ich weiß nicht, was unter "Register waren in jenen Tagen von höchster Priorität" zu verstehen ist - registergestützte Parameter, bei denen dies unkonventionell war, aber Parameter können auch auf den Stapel gelegt werden, wenn die Anzahl der Register begrenzt ist. Wenn Sie zum Beispiel 35 Parameter haben (ich glaube, MIPS hat 32 Register), müssten Sie die letzten 3 Parameter auf den Stack setzen. Auch spezifischer für die Implementierung wäre der FP an der Adresse im Speicher, an der sich die Rücksprungadresse befindet.
Jonathan
1
@Jonathan MIPS Von diesen 32 Registern war $ 0 0. $ at war reserviert, $ v0 und $ v1 waren für den Rückgabewert von Funktionsaufrufen, $ a0 - $ a3 waren Funktionsparameter, $ t0 - $ t9 waren temporär (Aufrufer erhalten) , $ s0 - $ s7 wurden gespeichert und $ gp, $ sp, $ fp und $ ra wurden vom System selbst verwendet. Insgesamt gab es nur 24 Allzweckregister, von denen einige Overhead-Register waren, wenn Sie sie verwenden wollten. Sie haben in der Regel nur die Register $ t (10) verwendet. Vergleichen Sie dies mit dem Itanium mit 128 Registern. Wenn Sie eine Funktion in MIPS mit 35 Parametern aufrufen, werden Sie wahrscheinlich alle auf den Stapel legen.
@ Jonathan Ich werde auch auf diesen Kommentar verweisen : "AMD Bulldozer: 96 physische GPRs, Intel Sandy Bridge: 160 physische GPRs, Intel Haswell: 168 physische GPRs". Bei Maschinen mit mehreren Kernen wird es lustig. SPARC hatte 160 Register . Ich weise Sie auch darauf hin, Fenster zu registrieren , die in einige der Designphilosophie von MIPS mit halb so vielen Registern eingingen wie seine Zeitgenossen.
Das ist also dasselbe wie bei der herkömmlichen Verwendung des %ebpBasiszeigerregisters in der x86-Aufrufkonvention? (Ich bin neu in all dem, aber es klingt wie die gleiche grundlegende Sache wie mit etw wie MOV 8(%ebp), %eaxoder so?)
ELLIOTTCABLE
Die Linie Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.ist nicht ganz klar, was das bedeutet
zadane