¿Qué significa para una CPU admitir una pila?

11

¿Cómo puede una CPU no admitir una pila? ¿Ninguna arquitectura que usa subrutinas (estoy bastante segura de que todas las arquitecturas) tienen que empujar la dirección de retorno en la pila para que pueda regresar a donde llamó la subrutina? La pila solo significa una sección de memoria con un puntero que crece en cierta dirección y actúa como una estructura de datos de pila, ¿no? Simplemente no entiendo cómo una arquitectura no puede soportar una pila.

¿En qué medida el almacenamiento en memoria automática (variables automáticas frente a variables estáticas) está determinado por el compilador frente a la arquitectura del hardware?

    
pregunta NickHalden

3 respuestas

8

Hay muchos microcontroladores de bajo nivel que tienen pilas de hardware para la llamada / devolución de subrutinas y el manejo de interrupciones, pero dificultan, si no imposible, almacenar datos (variables) allí, e implementar una pila de datos puramente de software sería terriblemente ineficiente. El 8051 es un ejemplo clásico, y los PIC de gama baja (PIC12 / PIC16) son otros. En estas máquinas, la pila de datos se emula al asignar ubicaciones de almacenamiento estático para variables automáticas, y la cantidad de reutilización de estas ubicaciones depende de la sofisticación del compilador.

Tenga en cuenta que si la emulación de pila se está haciendo de esta manera, significa que la recursión, una función que se llama a sí misma, directa o indirectamente, no funciona, ya que cada instancia de la función reutiliza las mismas ubicaciones estáticas para su supuesta "privacidad "variables. Algunos compiladores permiten el uso limitado de la recursión (generalmente implementado por medio de un #pragma de algún tipo), lo que hará que cree una verdadera pila de datos sin importar cuánto ralentice las cosas.

Aparte de esto, ha habido arquitecturas de CPU que no tenían una pila de hardware, ni siquiera para el manejo de subrutinas / interrupciones, incluido el DEC PDP-8 y el IBM System / 360. En estas máquinas, la PC (dirección de retorno) y el registro de estado (para interrupciones) se guardaron en registros o ubicaciones de memoria, pero en cada caso que se me ocurra, la máquina también tenía modos de dirección suficientemente flexibles que hacían fácil crear una pila con software.

    
respondido por el Dave Tweed
4

"apoyar una pila" significa

  1. tener un registro de puntero de pila explícito, y
  2. tener instrucciones de código de máquina primitivas para manipular / usar el registro de puntero de pila (como reti, que cambia el contador del programa en función del puntero de pila para regresar de una llamada de función).

Puede emular esto sin soporte de hardware a través de la emulación, que es un código generado por compilador que es el mismo tipo de cosas en la RAM usando variables. Es raro / infrecuente no tener soporte directo para la pila en cualquier arquitectura de computadora moderna.

La semántica de las variables en los lenguajes de programación no tiene casi nada que ver con la arquitectura de hardware de destino, para cualquier lenguaje superior al ensamblaje directo. El trabajo de los compiladores es generar un código de máquina que cumpla con el contrato semántico del lenguaje de programación.

    
respondido por el vicatcu
2

Algunas arquitecturas (por ejemplo, PIC) tienen una pila de hardware cuya capacidad es limitada (solo se puede utilizar para direcciones de retorno, no para variables). Algunas arquitecturas extremadamente pequeñas no tienen una instrucción de almacenamiento e incremento o PUSH, por lo que es más complicado hacer una pila.

Las variables 'automáticas' en C siempre deben compilarse para algo con el comportamiento de inicialización 'automática' y 'estática' con el comportamiento estático; en algunas arquitecturas no está permitido realizar recursiones, en cuyo caso el compilador puede asignar de forma estática todas las variables.

    
respondido por el pjc50

Lea otras preguntas en las etiquetas