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?
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?
Antworten:
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:
%ebp
Basiszeigerregisters 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), %eax
oder so?)
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