2009-05-25 20 views
5

Ha habido una pregunta aquí que habla sobre la dirección de crecimiento de la pila. A lo que Michael Burr respondió que en procesadores ARM se puede configurar la dirección de crecimiento de la pila, es decir, la pila descendente (comportamiento normal) crece hacia la dirección cero (dirección inferior) en memoria o ascendente, es decir, la pila crece hacia una dirección más alta en la memoria.¿Puedo configurar un procesador ARM para la dirección de crecimiento de la pila ascendente?

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

Mi pregunta es: en procesadores ARM, ¿cómo puedo hacer crecer la pila en la dirección ascendente?

¿Cómo configuro la pila como ascendente porque de manera predeterminada está descendiendo? Cualquier bit de registro establecido/restablecido, etc.

Respuesta

6

Bueno, los procesadores ARM no mantienen una pila directamente, pero sí tienen instrucciones diseñadas con eso en mente: LDM y STM. Entonces, si usa STMDB al comienzo de una función y LDMIA al final, efectivamente tiene una pila descendente completa: los ensambladores que recuerdo haber usado le permitieron escribir "STMFD" y "LDMFD" como alias. (Una pila "completa" es aquella en la que el puntero apila la última palabra en la pila, en lugar de la siguiente ubicación)

Así que no es algo que simplemente pueda reconfigurar en tiempo de ejecución: aunque si estuviera escribiendo su propio sistema operativo con su propia convención de llamadas, puede optar por usar una pila ascendente. Del mismo modo, también puede optar por no utilizar R13 como puntero de la pila; eso también es parte de la convención de llamadas. Esta elección se integra efectivamente en la implementación de cada función que usa la pila.

+0

Buena respuesta, excepto que Thumb depende de que r13 sea el puntero de la pila. –

+0

Ah, usé un ARM7TDMI por un tiempo pero nunca usé el modo Thumb. – araqnid

0

Hmmm thumb/thumb2 podría limitarlo a push/pop, y con thumb2 solo ARMs allí afuera No sé si podemos decir de manera genérica que puede usar ambas formas. Las instrucciones tradicionales del brazo, sí se puede ldmia o ldmdb (incremento después o decremento antes) y stmdb y stmia. ¿Cómo se hace un compilador de C, por ejemplo, subir direcciones en lugar de bajar de forma automática? No lo se.

Es como Big Endian en ARM, simplemente porque probablemente no quiera debido a los dolores de cabeza que conlleva.

1

Usted tienen la función de__user_initial_stackheap() que le ayuda a cambiar el SP utilizando Pila-Start, End-Pila & reubicación dinámico utilizando Montón-Start, Pila-End. Esta función se puede utilizar durante el tiempo de la inicialización, ya que ARM usaría esto para redirigir Pila y Heap.

Además, tiene la opción de utilizar un modelo de región única o de dos memorias [según sus requisitos]. He usado esta API cuando escribía UseCases que usaban ARM926EJ-S.

This documento fue de ayuda durante mi desarrollo y podría ser útil para usted también.

Espero que esto ayude.

-hjsblogger

Cuestiones relacionadas