Almacenar manualmente el puntero de pila en lugar de usar push y pop (Ensamblaje)

-3

¿Cuál será la secuencia de instrucciones que implementa PUSH R4?

A: SUB SP, SP, #4 STR R4, [SP, #0]

B: STR R4, [SP, #0] SUB SP, SP, #4

C: ADD SP, SP, #4 STR R4, [SP, #0]

D: STR R4, [SP, #0] ADD SP, SP, #4

E: todo lo anterior es posible

La respuesta correcta es E, pero no la sigo del todo.

Para A, SP apuntaría al valor de pila actual, y luego el comando SUB lo movería a un nuevo lugar vacío en la pila donde se almacena R4 .

Para B, R4 se almacena en el lugar actual de la pila y luego el puntero de la pila se mueve a un espacio vacío. ¿Esto no sobrescribiría el valor actual en la pila cuando se escribe R4 ?

Para C y D, ¿ ADD no lo moverá de la pila? Entonces, en C, R4 sobrescribe un valor, y en D, el siguiente valor insertado en la pila sobrescribiría R4 ?

    
pregunta stumped

2 respuestas

6

Estas secuencias de instrucciones no son equivalentes, son 4 formas diferentes de implementar pilas.

  • A es una pila de arriba a abajo donde el puntero de la pila se dirige al valor más reciente.
  • B es una pila de arriba a abajo donde el puntero de la pila se dirige al siguiente punto de inserción
  • C es una pila de abajo hacia arriba donde el puntero de la pila aborda el valor más reciente
  • D es una pila de abajo hacia arriba donde el puntero de la pila se dirige al siguiente punto de inserción

Todos ellos son formas válidas para que una CPU implemente una pila, y estaría a la elección de micro CPU de la CPU o la convención de llamada del sistema operativo si la CPU no tiene instrucciones explícitas de pila.

Tradicionalmente, las pilas de CPU están arriba-abajo (la pila comienza en una dirección alta en la memoria y crece hacia abajo). El motivo por el cual entiendo esto se debe principalmente a las CPU tempranas con poco espacio de direcciones y sin memoria virtual, es conveniente que la pila y el montón se inicien en los extremos opuestos de la memoria y crezcan hasta la mitad. Usualmente era más fácil hacer esto con la pila que con el montón. Ahora, con el espacio de direcciones de 64 bits y la memoria virtual, dudo que haya una gran diferencia, pero AFAIK, crecer es la opción más común.

    
respondido por el Evan
0

Todas las opciones anteriores son formas válidas de implementar una pila, pero no son equivalentes. La opción correcta dependería de la arquitectura específica. Por ejemplo, en la arquitectura ARM, solo funcionaría la primera opción, ya que ARM implementa una pila de arriba hacia abajo donde el puntero de la pila aborda el valor más recientemente introducido. Sin embargo, las otras opciones pueden funcionar para diferentes arquitecturas que pueden implementar la pila de manera diferente.

    
respondido por el AJT

Lea otras preguntas en las etiquetas