2009-05-25 14 views
5

C'è stata una domanda qui che ha parlato della direzione della crescita dello stack. A cui Michael Burr aveva risposto dicendo che i processori ARM impilavano la direzione di crescita possono essere configurati - cioè uno stack discendente (comportamento normale) cresce verso l'indirizzo zero (indirizzo inferiore) in memoria o ascendente, cioè lo stack cresce verso l'indirizzo superiore in memoria.Posso configurare un processore ARM per la direzione di crescita dello stack crescente?

What is the direction of stack growth in most modern systems?

la mia domanda è: in processori ARM, come posso fare la pila crescere in direzione ascendente?

Come si configura lo stack come crescente in base all'impostazione predefinita? Qualsiasi bit di registro impostato/ripristinato, ecc.

risposta

6

Bene, i processori ARM non gestiscono direttamente uno stack, ma hanno istruzioni che sono state progettate tenendo presente questo: LDM e STM. Quindi, se usi STMDB all'inizio di una funzione e LDMIA alla fine, hai effettivamente uno stack completo + discendente: gli assemblatori che ricordo di aver usato ti hanno permesso di scrivere "STMFD" e "LDMFD" come alias. (Uno stack "completo" è uno in cui il puntatore dello stack punta all'ultima parola sullo stack, a differenza della posizione successiva da utilizzare)

Quindi non è qualcosa che puoi semplicemente riconfigurare in fase di runtime: anche se stavi scrivendo il proprio sistema operativo con la propria convenzione di chiamata, è possibile scegliere di utilizzare uno stack crescente. Allo stesso modo, puoi anche scegliere di non utilizzare R13 come puntatore dello stack, anche questo è solo una parte della convenzione di chiamata. Questa scelta viene efficacemente integrata nell'implementazione di ogni funzione che utilizza lo stack.

+0

Buona risposta, se non che il pollice dipende r13 essere lo stack pointer. –

+0

Ah, ho usato un ARM7TDMI per un po 'ma non ho mai usato la modalità Thumb. – araqnid

0

Hmmm thumb/thumb2 potrebbe limitarti a push/pop, e con solo 2 ARM fuori là non so che possiamo dire genericamente che puoi andare in entrambe le direzioni. Istruzioni per le braccia tradizionali, sì puoi ldmia o ldmdb (incremento dopo o diminuzione prima) e stmdb e stmia. Come si fa ad esempio per fare in modo che un compilatore C salga sugli indirizzi invece che verso il basso automaticamente? Non lo so

È simile a Big Endian su ARM, solo perché probabilmente non lo si vuole a causa dei mal di testa che porta con sé.

1

si ha la funzione di__user_initial_stackheap(), che ti aiuta a cambiare la SP utilizza lo Stack-Start, Stack-End & mucchio delocalizzazione utilizzando Heap-Start, Mucchio-End. Questa funzione può essere utilizzata durante il periodo di inizializzazione poiché l'ARM lo userebbe per reindirizzare Stack e Heap.

Inoltre, è possibile utilizzare un modello a regione singola o a due memorie [a seconda del requisito]. Ho usato questa API quando stavo scrivendo UseCases che utilizzava ARM926EJ-S.

This documento era di aiuto durante il mio sviluppo e potrebbe essere utile anche a voi.

Spero che questo aiuti.

-hjsblogger

Problemi correlati