2013-07-20 27 views
5

ho visto un'annotazione a spingere/popping registri multipli nella stessa linea, per esempio:Braccio di montaggio - più ordine push/pop e SP

push {fp, lr} 

non riuscivo a scoprire chi è spinto prima - fp o lr?

Un'ulteriore domanda: SP punta all'ultimo indirizzo occupato nello stack o al primo libero?

Grazie!

risposta

2

Dal ARM ARM:

I registri sono memorizzati in sequenza, registro numero più basso per l'indirizzo di memoria più basso (start_address), attraverso al registro numero più alto nell'indirizzo di memoria più alta (end_address)

Su ARM, il puntatore dello stack normalmente punta all'ultimo indirizzo occupato nello stack. Ad esempio, quando si imposta il puntatore dello stack iniziale, si inizializza normalmente con l'indirizzo uno dopo la fine dello stack.

PUSH è solo un sinonimo di STMDB utilizzando sp come registro di base. DB indica la modalità di indirizzamento "decrementa prima".

+0

Quanto è calmo dopo la fine della pila? non indicherà l'ultimo indirizzo vuoto? – Niv

+0

Dipende da cosa intendi per 'fine'. Intendo l'indirizzo più alto. Le pile normalmente crescono da indirizzi alti a bassi. Ciò significa che una spinta decrementa il puntatore dello stack e quindi memorizza una parola. Un pop carica una parola e quindi incrementa il puntatore dello stack. –

+0

Oh, ora capisco. grazie :) – Niv