Funcionamiento de la Memoria de Pila y Registros de Activación
Clasificado en Informática
Escrito el en
español con un tamaño de 2,45 KB
Memoria de Pila
Las funciones recursivas requieren manejar diferentes instancias del registro de activación, es decir, del conjunto de valores de sus variables en cada ejecución de la función.
Estos registros de activación se almacenan en forma de pila, de manera que el registro de la cima de la pila corresponde a la función en ejecución.
Al terminar la ejecución de una función, debe desapilarse el registro de activación. Al traspasar el control de una función a otra, es necesario almacenar el estado de la máquina (el conjunto de valores de los registros del procesador). También es necesario almacenar la dirección del comienzo del registro de activación de la función llamante. Esta información se añade al contenido del registro de activación de cada función.
Estructura de un registro de activación
Con memoria basada en pila, el procesador maneja dos registros especiales:
- Stack Pointer (SP): Dirección de la cima de la pila.
- Frame Pointer (FP): Dirección base del registro de activación de la función activa.
Los valores de los parámetros de una función corresponden a desplazamientos negativos respecto a FP; los de las variables locales y temporales corresponden a desplazamientos positivos.
Procedimiento de llamada a una función
- Se reserva espacio para el valor devuelto.
- Se almacena el valor de los parámetros que se pasan a la función llamada.
- Se almacena el valor de la dirección del código de la función que llama (dirección de retorno).
- Se almacena el estado de la máquina (incluye SP y FP).
- Se pasa el control a la función llamada.
- Comienza la ejecución del código de la función llamada.
Procedimiento de retorno de una función
- Se asigna el valor devuelto.
- Se restaura el contenido del estado de la máquina. Esto modifica el valor de FP y SP y provoca la liberación de la memoria ocupada por el registro de activación de la función llamada.
- Se restaura el valor de la dirección del código de la función que llama (dirección de retorno).
- Se devuelve el control a la función que llama.
- Se almacena el valor devuelto en la variable local o temporal adecuada.