Pila de llamadas

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 12 de marzo de 2018; las comprobaciones requieren 3 ediciones .

pila de llamadas _ _  _ _ _ _ _ _ _ llamadas) y/o para volver al programa desde un controlador de interrupciones (incluso al cambiar de tarea en un entorno multitarea ).

Cuando se llama a una subrutina o se produce una interrupción , la dirección de retorno se ingresa en la pila  , la dirección en la memoria de la siguiente instrucción del programa suspendido, y el control se transfiere a la subrutina o al controlador de subrutina. Con una llamada anidada o recursiva posterior, la interrupción de una subrutina o un controlador de interrupciones, la siguiente dirección de retorno se coloca en la pila, etc.

Al regresar de una subrutina o controlador de interrupciones, la dirección de retorno se extrae de la pila y el control se transfiere a la siguiente instrucción del (sub)programa suspendido.

Implementación

La pila de llamadas generalmente se implementa de una de las siguientes maneras:

Si no hay pila o su profundidad es limitada, se excluyen las llamadas anidadas o se limita su número. Si se necesita más anidamiento, la pila de llamadas o su extensión se pueden implementar mediante programación.

Soporte

Las llamadas a subrutinas y los retornos de las subrutinas y los controladores de interrupciones generalmente se realizan mediante instrucciones de procesador especializadas. Además de las instrucciones de llamada y devolución, los procesadores a menudo tienen instrucciones para usar la pila de llamadas y también para guardar datos: ponerlos en la pila, eliminarlos de la pila, modificar el contenido de la pila.

Las instrucciones call, return y stack pueden diferir en el tamaño de los datos almacenados (en este caso, debe usar las instrucciones correspondientes o sus equivalentes).

A veces, los procedimientos de retorno de una subrutina y un controlador de interrupción difieren entre sí y también requieren instrucciones diferentes (por ejemplo, al regresar de una interrupción, a menudo es necesario sacar el registro de bandera de la pila y/o habilitar el procesamiento de interrupciones simultáneas, que pueden desactivarse automáticamente cuando se llama al controlador).

En ausencia de instrucciones especializadas (en procesadores con un conjunto de instrucciones reducido), las llamadas, devoluciones y otros trabajos con la pila de llamadas se implementan mediante las instrucciones habituales para trabajar con memoria/registros y transferencia de control.

Uso

La pila de llamadas se puede usar para una variedad de propósitos, pero su objetivo principal es realizar un seguimiento de dónde debe regresar cada uno de los procedimientos llamados después de que se haya completado. Para hacer esto, cuando se llama a un procedimiento (mediante instrucciones de llamada), la dirección de la instrucción que sigue a la instrucción de llamada (la "dirección de retorno") se coloca en la pila. Al finalizar, el procedimiento llamado debe emitir una instrucción de retorno para saltar a la dirección en la pila.

Además de las direcciones de retorno, se pueden almacenar otros datos en la pila, por ejemplo:

Uso de la pila en sistemas multitarea

En los sistemas multitarea , cada tarea normalmente tiene su propia pila, y cuando se cambia una tarea, el puntero de pila del procesador se mueve hacia ella.

Uso no estándar

La pila se puede utilizar de forma no estándar, por ejemplo:

Usos alternativos

En un uso alternativo, el puntero de la pila se mueve al área de datos y las instrucciones de la pila se usan como operaciones de cadena para procesar datos secuenciales en la memoria.

En el uso alternativo, el procesamiento de interrupciones no es posible porque las interrupciones deben deshabilitarse para evitar la corrupción de datos.

Notas

Véase también

Notas

  1. Registro - dirección - retorno - Gran Enciclopedia de Petróleo y Gas, artículo . Consultado el 13 de enero de 2016. Archivado desde el original el 16 de agosto de 2016.