PDA

View Full Version : [Assembly 68000] Stack pointer e Frame pointer


Bandit
24-02-2009, 16:53
Ciao a tutti ragazzi
vorrei una manina per quanto riguarda questi argomenti, che sono poco simpatici

Lo stack pointer (SP) è il puntatore allo stack che indica istante per istante l'ultimo elemento presente nelo stack (ultimo vuol dire in cima)

Push carica dato nello stack facendo salire lo SP (cioè decremento), mentre con pop si preleva il dato dallo stack e SP scende (cioè lo si incrementa).


Questo Frame pointer cosa sarebbe?lo si introduce quando si parla della subrutine.

a questo proposito,
c'è il comando JSR (salto alla subrutine) vado a salvare l'indirizzo di ritorno presente nel Program Counter, cioè facccio un push sullo stack, memorizzando anche i parametri di input e di output

Mentre RTS (ritorno dalla subrutine) fa un'operazione di pop per quanto riguarda ciò che aveva salvato JSR

ora sulle slides c'è scritto che questa parte di memoria dello stack riservata per memorizzare queste cose , viene acceduto da un frame pointer che è un registro indirizzo

Cosa potete dirmi al riguardo?

ciao e grazie

cionci
24-02-2009, 17:04
Ma di quale assembly parli ?

Bandit
24-02-2009, 17:12
di quello per il 68000

cionci
24-02-2009, 17:18
I primi due link che ho trovato:

http://www-scm.tees.ac.uk/users/a.clements/LNKintro/LNKnotes.htm
http://www.scarpaz.com/2005-Didattica/Scarpazza-2005-68k-4-sottoprogrammi.pdf

Si capisce che il Frame Pointer è il puntatore al record di attivazione, cioè alle informazioni necessarie per ripristinare l'esecuzione del chiamante.

Bandit
24-02-2009, 17:26
ma quindi il JSR permette di memorizzare tutto ciò che potrà servire, dopo lo svolgimento della subrutine, a ritornare al programma principale.
e queste cose memorizzate nello stack vengono puntate dal frame pointer?

cionci
24-02-2009, 18:51
Sì. Guarda il pdf che ti ho linkato, c'è l'immagine esatta di ciò che avviene.

Bandit
24-02-2009, 19:05
si l'avevo visto, ma quindi si può dire che il frame pointe serve per memorizzare dove bisogna ritornare sull ostack, per poter andare avanti col programma chiamante?

cionci
24-02-2009, 19:14
Serve come base per ripristinare lo stack pointer e ripristinare il frame pointer precedente. Comunque guarda sul pdf l'uso delle istruzioni LINK e UNLK.
Di fatto identifica la base dello stack locale alla funzione.

cdimauro
24-02-2009, 19:34
si l'avevo visto, ma quindi si può dire che il frame pointe serve per memorizzare dove bisogna ritornare sull ostack, per poter andare avanti col programma chiamante?
Serve per due cose: memorizzare il puntatore allo stack per poi recuperarlo prima di tornare al chiamante, e permettere di accedere alle variabili locali alla subroutine allocate sullo stack.

fero86
24-02-2009, 22:56
in realtá il frame pointer é utile solo per scopi di debug e puó essere tranquillamente omesso; adesso non so le particolaritá dell'architettura 68000, ma ad esempio il compilatore Microsoft ha l'opzione /Oy ed il gcc ha l'opzione -fomit-frame-pointer.

cdimauro
25-02-2009, 07:52
Nei 68000 con LINK puoi specificare anche un offset per allocare spazio sullo stack, oltre a conservare il vecchio SP.

E' un'istruzione molto utile per i compilatori di linguaggi ad alto livello. L'ho vista usare parecchio con questi.