Spiegazione del puntatore alla cornice


28

In MIPS montaggio , v'è un registro per il puntatore dello stack, e un altro registro per il puntatore telaio. Qual è il puntatore a cornice e qual è il suo scopo? In cosa differisce dal puntatore dello stack?


1
Quale ricerca hai già fatto - e qual è la tua familiarità con i termini? A che sistema serve (sistemi diversi hanno una terminologia diversa)?

Voglio solo familiarizzare con il puntatore a cornice (assemblaggio mips). Non capisco come sia d'aiuto, perché ne abbiamo bisogno? Grazie mille
qwaserdftyghuijkiii

Risposte:


44

Nell'assemblaggio MIPS, il puntatore dello stack punta nella parte superiore dello stack. Quando si alloca spazio nello stack, il puntatore dello stack ($ sp) si sposta per puntare alla memoria libera.

Quando si chiama una subroutine nell'assembly MIPS (i registri erano un premio in quei giorni - i parametri basati sui registri dove non convenzionali), si scrivono i parametri nello stack e quindi si fa avanzare il puntatore dello stack.

All'avvio del metodo, 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 può ora trovarsi in 24($sp)invece. Questo può rendere il codice un po 'confuso.

Il puntatore del frame ($ fp) punta all'inizio del frame dello stack e non si sposta per la durata della chiamata della subroutine. Questo punta alla base del frame dello stack e i parametri passati alla subroutine rimangono in un punto costante rispetto al puntatore del frame.

Tieni presente che il puntatore al frame dovrà essere archiviato e ripristinato con chiamate di subroutine che lo modificano.

Ulteriori letture:


Non so che cosa si intenda per "registri erano un premio in quei giorni - parametri basati sui registri dove non convenzionali" ma i parametri possono anche essere messi in pila quando il numero di registri è limitato. Se ad esempio hai 35 parametri (credo che MIPS abbia 32 reg.) Allora dovresti mettere in pila gli ultimi 3 parametri. Inoltre, più specifici per l'implementazione, il FP sarebbe all'indirizzo in memoria dove si trova l'indirizzo di ritorno.
Jonathan

1
@Jonathan MIPS Di quei 32 registri, $ 0 era 0. $ a 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 utilizzati dal sistema stesso. Tutto sommato, c'erano solo 24 registri di uso generale e alcuni di quelli sostenuti in alto se si desidera utilizzare. In genere hai usato solo i registri $ t (10). Confronta questo con l'Itanium che ha 128 registri. Chiamando una funzione in MIPS con 35 parametri, probabilmente li metteresti tutti in pila.

@Jonathan Indico anche 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 suggerisco anche di registrare la finestra che è entrata in alcuni dei principi di progettazione MIPS con la metà dei registri dei suoi contemporanei.

Quindi, questa è la stessa cosa dell'uso convenzionale del %ebpregistro del "puntatore di base" nella convenzione di chiamata x86? (Sono nuovo a tutto questo, ma sembra la stessa cosa di base dell'uso di sth like MOV 8(%ebp), %eaxo simili?)
ELLIOTTCABLE

La linea Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.non è del tutto chiara su cosa significhi
zadane il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.