În ansamblul MIPS , există un registru pentru indicatorul stivei, și un alt registru pentru pointerul cadru. Ce este indicatorul de cadru și care este scopul său? În ce diferență de indicatorul stivei?

Comentarii

  • Ce cercetări ați făcut deja – și care este familiaritatea dvs. cu termenii? Pentru ce sistem este acesta (diferite sisteme au terminologie diferită)?
  • Vreau doar să mă familiarizez cu indicatorul de cadru (ansamblul mips). Nu ' nu înțeleg cum ajută, de ce avem nevoie de el? Mulțumesc mult

Răspuns

În ansamblul MIPS, indicatorul stivei indică partea de sus a stivei. Pe măsură ce alocați spațiu pe stivă, indicatorul stivei ($ sp) se deplasează pentru a indica memoria liberă.

Când ați apelat un subrutină în ansamblul MIPS (registrele erau la prima în acele zile – parametrii bazați pe înregistrare unde neconvențional), se scrie parametrii în stivă și apoi se avansează indicatorul stivei.

Când metoda începe, un parametru poate fi la un offset de 16($sp). Cu toate acestea, pe măsură ce variabilele sunt plasate pe stivă, indicatorul stivei se mișcă și același parametru poate fi acum localizat la 24($sp). Acest lucru poate face codul puțin confuz.

Pointerul cadrului ($ fp) indică începutul cadrului stivei și nu se mișcă pe durata apelului subrutinei. Aceasta indică baza cadrului stivei, iar parametrii care sunt trecuți în subrutină rămân într-un punct constant față de indicatorul cadrului.

Realizați că indicatorul cadrului va trebui stocat și restaurat cu apeluri de subrutină care îl modifică.

Lecturi suplimentare:

Comentarii

  • Nu ' nu știu ce se înțelege prin " registrele erau la o primă în acele zile – parametrii bazați pe înregistrări unde " neconvențional, dar parametrii poate fi, de asemenea, pus pe stivă atunci când # de regi sters este limitat. Dacă aveți 35 de parametri, de exemplu (cred că MIPS are 32 de reg.), Atunci ar trebui să puneți ultimii 3 parametri în stivă. De asemenea, mai specific implementării, FP ar fi la adresa din memorie unde este adresa de returnare.
  • @Jonathan MIPS Din cele 32 de registre, $ 0 era 0. $ at a fost rezervat, $ v0 și $ v1 erau pentru valoarea returnată a apelurilor de funcții, $ a0 – $ a3 erau parametri de funcție, $ t0 – $ t9 au fost temporare (se păstrează apelantul), $ s0 – $ s7 au fost salvate și $ gp, $ sp, $ fp și $ ra au fost utilizate de către sistemul însuși. Una peste alta, existau doar 24 de registre cu scop general și unele dintre cele suportate în general dacă doriți să utilizați. În general, ați folosit doar registrele $ t (10). Comparați acest lucru cu Itanium, care are 128 de registre. Apelând o funcție în MIPS cu 35 de parametri, probabil că le-ați pune pe toate în stivă.
  • @Jonathan I ' voi indica, de asemenea, spre acest comentariu : " Buldozer AMD: 96 GPR-uri fizice, Intel Sandy Bridge: 160 GPR-uri fizice, Intel Haswell: 168 GPR-uri fizice ". Lucrurile devin amuzante cu mai multe mașini de bază. SPARC avea 160 de registre . Vă indic, de asemenea, către fereastră de înregistrare care a intrat în unele dintre filozofia de proiectare a MIPS cu jumătate din numărul de registre decât contemporanii săi.
  • Deci , acesta este același lucru ca și utilizarea convențională a %ebp registrul „pointer de bază” în convenția de apelare x86? (Eu ' sunt nou pentru toate acestea, dar sună ca același lucru de bază ca utilizarea sth ca MOV 8(%ebp), %eax sau așa ceva?)
  • Linia Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it. nu este foarte clar ce înseamnă asta

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *