In assembly MIPS , cè un registro per lo stack pointer, e un altro registro per il puntatore del fotogramma. Cosè il frame pointer e qual è il suo scopo? In cosa differisce dallo stack pointer?
Commenti
- Quali ricerche hai già fatto e qual è la tua familiarità con i termini? Per che sistema è questo (sistemi diversi hanno una terminologia diversa)?
- Voglio solo familiarizzare con il puntatore al frame (assembly mips). Non ' non capisco come aiuta, perché ne abbiamo bisogno? Grazie mille
Risposta
Nellassembly MIPS, il puntatore dello stack punta in cima allo stack. Man mano che si alloca lo spazio sullo stack, il puntatore allo stack ($ sp) si sposta per puntare alla memoria libera.
Quando si chiama una subroutine nellassembly MIPS (i registri erano un premio in quei giorni – parametri basati sui registri dove non convenzionale), si scrivono i parametri nello stack e poi si fa avanzare il puntatore allo stack.
Quando il metodo inizia, un parametro può trovarsi a un offset di 16($sp)
. Tuttavia, poiché le variabili vengono posizionate nello stack, il puntatore dello stack si sposta e lo stesso parametro potrebbe ora essere posizionato in 24($sp)
. Questo può creare un po di confusione nel codice.
Il puntatore al frame ($ fp) punta allinizio dello stack frame e non si sposta per la durata della chiamata alla subroutine. Questo punta alla base dello stack frame e i parametri che vengono passati alla subroutine rimangono in un punto costante rispetto al puntatore del frame.
Renditi conto che il puntatore del frame dovrà essere memorizzato e ripristinato con chiamate di subroutine che lo modificano.
Ulteriori letture:
- UWisc Madison CS 354 Convenzioni MIPS
- Capitolo 3 MIPS Assembly Language
- UMD CS 311 Comprensione the Stack
- UWash Seattle CSE 410 Riepilogo delle convenzioni di chiamata MIPS
- Wikipedia Puntatore frame
Commenti
- I don ' Non so cosa si intende per " i registri erano un premio in quei giorni – i parametri basati sui registri erano " ma parametri non convenzionali può anche essere messo in pila quando il # di regi sters è limitato. Se hai 35 parametri, ad esempio (credo che MIPS abbia 32 reg.), Allora dovresti mettere gli ultimi 3 parametri sullo stack. Inoltre, più specifico per limplementazione, lFP sarebbe allindirizzo in memoria dove si trova lindirizzo di ritorno.
- @Jonathan MIPS Di questi 32 registri, $ 0 era 0. $ at era riservato, $ v0 e $ v1 erano per il valore di ritorno delle chiamate di funzione, $ a0 – $ a3 erano parametri di funzione, $ t0 – $ t9 erano temporanei (il chiamante conserva), $ s0 – $ s7 sono stati salvati e $ gp, $ sp, $ fp e $ ra sono stati usati dal sistema stesso. Tutto sommato, cerano solo 24 registri per uso generale e alcuni di quelli sostenevano un sovraccarico se si desiderava utilizzare. In genere hai usato solo i registri $ t (10). Confronta questo con lItanium che ha 128 registri. Chiamando una funzione in MIPS con 35 parametri, probabilmente li metteresti tutti in pila.
- @Jonathan I ' punterà anche a questo commento : " AMD Bulldozer: 96 GPR fisici, Intel Sandy Bridge: 160 GPR fisici, Intel Haswell: 168 GPR fisici ". Le cose si fanno divertenti con più macchine core. SPARC aveva 160 registri . Ti indico anche alla finestra di registro che è entrata in parte della filosofia di progettazione di MIPS con la metà dei registri dei suoi contemporanei.
- Quindi , è la stessa cosa delluso convenzionale del registro
%ebp
puntatore di base nella convenzione di chiamata x86? (Sono ' nuovo in tutto questo, ma sembra la stessa cosa di base delluso di qc comeMOV 8(%ebp), %eax
o simili?) - La riga
Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.
non è del tutto chiara cosa significhi