I MIPS-montering finns ett register för stackpekaren, och ett annat register för rampekaren. Vad är rampekaren och vad är dess syfte? Hur skiljer det sig från stackpekaren?
Kommentarer
- Vilken forskning har du redan gjort – och vad är din förtrogenhet med termerna? För vilket system är det här (olika system har olika terminologi)?
- Jag vill bara bekanta mig med rampekaren (mipsmontering). Jag förstår inte ' hur det hjälper, varför behöver vi det? Tack så mycket
Svar
I MIPS-montering pekar stackpekaren mot toppen av stacken. När du tilldelar utrymme på stacken flyttas stackpekaren ($ sp) för att peka på det lediga minnet.
När du anropar en underrutin i MIPS-sammansättningen (register hade en premie på den tiden – registerbaserade parametrar där okonventionellt), skriver man parametrarna till stacken och avancerar sedan stackpekaren.
När metoden börjar kan en parameter vara i en förskjutning av 16($sp)
. Eftersom variabler placeras på stacken flyttas stackpekaren och samma parameter kan nu placeras vid 24($sp)
istället. Detta kan göra koden lite förvirrande.
Rampekaren ($ fp) pekar på början av stackramen och rör sig inte under underrutinsamtalet. Detta pekar på basen på stapelramen och parametrarna som skickas in till underrutinen förblir på en konstant plats relativt rampekaren.
Inse att rampekaren måste lagras och återställas med underrutinanrop som ändrar det.
Ytterligare läsning:
- UWisc Madison CS 354 MIPS-konventioner
- Kapitel 3 MIPS monteringsspråk
- UMD CS 311 Förståelse stacken
- UWash Seattle CSE 410 MIPS Sammanfattning av samtalskonventioner
- Wikipedia Rampekare
Kommentarer
- Jag don ' vet inte vad som menas med " -register hade en premie på den tiden – registerbaserade parametrar där okonventionella " men parametrar kan också läggas på stacken när # av regi sters är begränsad. Om du till exempel har 35 parametrar (jag tror att MIPS har 32 reg.) Skulle du behöva lägga de tre sista parametrarna på stacken. Mer specifikt för implementering skulle FP vara på adressen i minnet där returadressen är.
- @Jonathan MIPS Av dessa 32 register var $ 0 0. $ at var reserverat, $ v0 och $ v1 var för returvärdet för funktionssamtal, $ a0 – $ a3 var funktionsparametrar, $ t0 – $ t9 var tillfälliga (samtalskonserver), $ s0 – $ s7 sparades och $ gp, $ sp, $ fp och $ ra användes av själva systemet. Sammantaget fanns det bara 24 allmänna ändamålsregister och några av dem som uppkommit över huvudet om du ville använda. Du använde vanligtvis bara $ t-registren (10). Jämför detta med Itanium som har 128 register. När du ringer till en funktion i MIPS med 35 parametrar skulle du troligen lägga dem alla på stacken.
- @Jonathan I ' Jag pekar också på den här kommentaren : " AMD Bulldozer: 96 fysiska GPR, Intel Sandy Bridge: 160 fysiska GPR, Intel Haswell: 168 fysiska GPR ". Saker blir roliga med flera kärnmaskiner. SPARC hade 160 register . Jag pekar också på registerfönster som gick in i MIPS designfilosofi med hälften så många register som dess samtida.
- Så , är detta samma sak som den konventionella användningen av
%ebp
”baspekare” -registret i x86-anropskonventionen? (Jag ' är ny för allt detta, men det låter som samma grundläggande sak som att använda sth somMOV 8(%ebp), %eax
eller sådant?) - Raden
Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.
är inte helt tydlig vad det betyder