In MIPS-assembly is er een register voor de stack-pointer, en een ander register voor de frameaanwijzer. Wat is de kaderwijzer en wat is het doel ervan? Waarin verschilt het van de stack pointer?

Reacties

  • Welk onderzoek heb je al gedaan – en wat is je bekendheid met de termen? Voor welk systeem is dit bedoeld (verschillende systemen hebben verschillende terminologie)?
  • Ik wil gewoon vertrouwd raken met frame pointer (mips assembly). Ik begrijp niet ' hoe het helpt, waarom hebben we het nodig? Heel erg bedankt

Answer

In MIPS-assembly wijst de stapelwijzer naar de bovenkant van de stapel. Terwijl u ruimte op de stapel toewijst, beweegt de stapelwijzer ($ sp) om naar het vrije geheugen te wijzen.

Bij het aanroepen van een subroutine in MIPS-assembly (registers waren in die dagen duur – registergebaseerde parameters waar onconventioneel), schrijft men de parameters naar de stapel en zet dan de stapelwijzer vooruit.

Wanneer de methode begint, kan een parameter zich op een offset van 16($sp). Aangezien variabelen echter op de stapel worden geplaatst, wordt de stapelaanwijzer verplaatst en kan de dezelfde parameter zich nu op 24($sp) bevinden. Dit kan de code een beetje verwarrend maken.

De frame pointer ($ fp) wijst naar het begin van het stack frame en beweegt niet gedurende de subroutine aanroep. Dit wijst naar de basis van het stapelframe en de parameters die aan de subroutine worden doorgegeven, blijven op een constante plek ten opzichte van de framepointer.

Realiseer je dat de framepointer moet worden opgeslagen en hersteld met subroutine-aanroepen die het wijzigen.

Verder lezen:

Reacties

  • Ik don ' weet niet wat er wordt bedoeld met " registers waren in die tijd duur – op register gebaseerde parameters waren onconventioneel " maar parameters kan ook op de stapel worden gezet als de # van regi sters is beperkt. Als je bijvoorbeeld 35 parameters hebt (ik geloof dat MIPS 32 regs. Heeft), dan zou je de laatste 3 parameters op de stapel moeten plaatsen. Ook specifieker voor implementatie, zou de FP op het adres in het geheugen staan waar het retouradres is.
  • @Jonathan MIPS Van die 32 registers was $ 0 0. $ at was gereserveerd, $ v0 en $ v1 waren voor de retourwaarde van functieaanroepen, $ a0 – $ a3 waren functieparameters, $ t0 – $ t9 waren tijdelijk (beller behouden), $ s0 – $ s7 werden opgeslagen en $ gp, $ sp, $ fp en $ ra werden door het systeem zelf gebruikt. Al met al waren er slechts 24 registers voor algemene doeleinden en sommige daarvan hadden overheadkosten als u die wilde gebruiken. Over het algemeen gebruikte u alleen de $ t-registers (10). Vergelijk dit met de Itanium die 128 registers heeft. Als je een functie in MIPS aanroept met 35 parameters, zou je ze waarschijnlijk allemaal op de stapel zetten.
  • @Jonathan I ' ll ook verwijzen naar deze opmerking : " AMD Bulldozer: 96 fysieke GPRs, Intel Sandy Bridge: 160 fysieke GPRs, Intel Haswell: 168 fysieke GPRs ". Dingen worden grappig met meerdere kernmachines. SPARC had 160 registers . Ik wijs je ook op registervenster dat deel uitmaakte van de ontwerpfilosofie van MIPS met half zoveel registers als zijn tijdgenoten.
  • Dus , dit hetzelfde is als het conventionele gebruik van het %ebp base pointer-register in de x86-oproepconventie? (Ik ' ben nieuw in dit alles, maar het klinkt als hetzelfde basale ding als het gebruik van sth zoals MOV 8(%ebp), %eax of zoiets?)
  • De regel Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it. is niet helemaal duidelijk wat dat betekent

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *