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

Kommentare

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

Antwort

In der MIPS-Assembly zeigt der Stapelzeiger auf die Oberseite 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 teuer – registergestützte Parameter wo unkonventionell) schreibt man die Parameter in den Stapel und rückt dann den Stapelzeiger vor.

Wenn die Methode startet, kann ein Parameter einen Versatz von 16($sp). Wenn jedoch Variablen auf dem Stapel platziert werden, bewegt sich der Stapelzeiger und der gleiche Parameter befindet sich jetzt möglicherweise stattdessen unter 24($sp). Dies kann den Code etwas verwirrend machen.

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 an einer konstanten Stelle relativ zum Rahmenzeiger.

Stellen Sie fest, dass der Rahmenzeiger gespeichert und wiederhergestellt werden muss mit Unterprogrammaufrufen, die es ändern.

Weiterführende Literatur:

Kommentare

  • Ich habe ' Ich weiß nicht, was unter " Register waren damals sehr teuer – registergestützte Parameter, bei denen unkonventionelle " aber Parameter kann auch auf den Stapel gelegt werden, wenn die Anzahl der regi sters ist begrenzt. Wenn Sie zum Beispiel 35 Parameter haben (ich glaube, MIPS hat 32 Register), müssten Sie die letzten 3 Parameter auf den Stapel legen. Ebenfalls spezifischer für die Implementierung wäre das FP an der Adresse im Speicher, an der sich die Rücksprungadresse befindet.
  • @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-Reserven), $ s0 – $ s7 wurden gespeichert und $ gp, $ sp, $ fp und $ ra wurden vom System selbst verwendet. Alles in allem gab es nur 24 Allzweckregister und einige davon entstanden, wenn Sie sie verwenden wollten. Sie haben im Allgemeinen nur die $ t-Register (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 ' zeige auch auf dieser Kommentar : " AMD Bulldozer: 96 physische GPRs, Intel Sandy Bridge: 160 physische GPRs, Intel Haswell: 168 physische GPRs ". Mit mehreren Kernmaschinen wird es lustig. SPARC hatte 160 Register . Ich verweise Sie auch auf das Registerfenster , das in einen Teil der Designphilosophie von MIPS mit halb so vielen Registern wie seine Zeitgenossen eingegangen ist.
  • Also ist dies dasselbe wie die herkömmliche Verwendung des %ebp Basiszeiger-Registers in der x86-Aufrufkonvention? (Ich ' bin neu in all dem, aber es klingt wie die gleiche grundlegende Sache wie die Verwendung von etw wie MOV 8(%ebp), %eax oder so?)
  • Die Zeile 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.