I MIPS-samling er det et register for stabelpekeren, og et annet register for rammepekeren. Hva er rammepekeren og hva er formålet med det? Hvordan skiller den seg fra stakkpekeren?

Kommentarer

  • Hvilken undersøkelse har du allerede gjort – og hva er din fortrolighet med vilkårene? Hvilket system er dette for (forskjellige systemer har forskjellig terminologi)?
  • Jeg vil bare gjøre meg kjent med rammepekeren (mips montering). Jeg forstår ikke ' hvordan det hjelper, hvorfor trenger vi det? Tusen takk

Svar

I MIPS-samling peker stabelpekeren mot toppen av stabelen. Når du tildeler plass på stakken, flytter stakkpekeren ($ sp) til å peke på ledig minne.

Når du ringer til en underrutine i MIPS-samlingen (registre hadde en premie i disse dager – registerbaserte parametere der det er ukonvensjonelt), skriver man parametrene til stabelen og fremrykker deretter stabelpekeren.

Når metoden starter, kan en parameter være i en forskyvning av 16($sp). Når variabler plasseres på bunken, beveger stabelpekeren seg, og den samme parameteren kan nå være plassert ved 24($sp) i stedet. Dette kan gjøre koden litt forvirrende.

Rammepekeren ($ fp) peker på starten av stabelrammen og beveger seg ikke under varigheten av underrutinen. Dette peker på bunnen av stabelrammen, og parametrene som sendes inn til underrutinen forblir på et konstant sted i forhold til rammepekeren.

Innse at rammepekeren må lagres og gjenopprettes med underrutineanrop som endrer den.

Videre lesing:

Kommentarer

  • Jeg don ' vet ikke hva som menes med " -registrene hadde en premie i disse dager – registerbaserte parametere der ukonvensjonelle " men parametere kan også settes på bunken når # av regi sters er begrenset. Hvis du for eksempel har 35 parametere (jeg tror MIPS har 32 reg.), Må du sette de siste 3 parametrene på stakken. Også mer spesifikk for implementering, vil FP være på adressen i minnet der returadressen er.
  • @Jonathan MIPS Av de 32 registrene var $ 0 0. $ at var reservert, $ v0 og $ v1 var for returverdien av funksjonsanrop, $ a0 – $ a3 var funksjonsparametere, $ t0 – $ t9 var midlertidige (samtaler bevarer), $ s0 – $ s7 ble lagret, og $ gp, $ sp, $ fp og $ ra ble brukt av selve systemet. Alt i alt var det bare 24 generelle formålsregistre og noen av dem som ble påført overhead hvis du ønsket å bruke. Du brukte vanligvis bare $ t-registerene (10). Sammenlign dette med Itanium som har 128 registre. Når du kaller en funksjon i MIPS med 35 parametere, vil du sannsynligvis sette dem alle på bunken.
  • @Jonathan I ' Peker også på denne kommentaren : " AMD Bulldozer: 96 fysiske GPR, Intel Sandy Bridge: 160 fysiske GPR, Intel Haswell: 168 fysiske GPR ". Ting blir morsomme med flere kjernemaskiner. SPARC hadde 160 registre . Jeg peker deg også på registervindu som gikk inn i noe av designfilosofien til MIPS med halvparten så mange registre som dets samtid.
  • Så , er dette det samme som den konvensjonelle bruken av %ebp basepeker -registeret i x86-anropskonvensjonen? (Jeg ' er ny for alt dette, men det høres ut som den samme grunnleggende tingen som å bruke sth som MOV 8(%ebp), %eax eller slikt?)
  • Linjen Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it. er ikke helt klar hva det betyr

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *