El registro de activación de una función almacena el valor de las variables temporales y locales de la función, así como información
del estado del procesador antes de la ejecución de la función. Esto último permite restaurar el estado del procesador al término
de la ejecución de la función.
A continuación se muestra un ejemplo del contenido del registro de activación de una función, tal y como lo gestiona el compilador
de Tinto. El ejemplo se refiere a una función con dos variables locales (var0 y
var1), tres variables temporales (tmp0, tmp1 y tmp2)
y tres argumentos (arg0, arg1 y arg2).

El frame pointer contiene la dirección de la posición más baja del registro. El
compilador de Tinto coloca en primer lugar a las variables locales. Teniendo en
cuenta que todos los tipos de datos de Tinto ocupan 4 bytes, las posiciones de
memoria de cada variable se obtienen incrementando el puntero en bloques de 4
bytes. Por tanto, en este caso la variable local var0 está situada en
la posición ($fp+0), mientras que la variable local var1 se
encuentra en la posición ($fp+4).
A continuación de las variables
locales se colocan las variables temporales de
la función. En este caso se trata de las variables tmp0, tmp1
y tmp2, que se colocan en las posiciones ($fp+8), ($fp+12) y ($fp+16).
Por encima de las variables
temporales se sitúa la información del estado del
procesador. El compilador de Tinto no almacena el estado completo del procesador
(que sería el valor de todos sus registros de propósito general y de la unidad
de coma flotante) ya que no es necesario y además consumiría mucho tiempo en los
cambios de función. En su lugar se almacenan sólo los valores de los registros
$fp (que contiene la posición base del registro de activación de la función que
realiza la llamada) y $ra (que contiene la dirección de retorno de la función,
es decir, la posición de la instrucción de la función llamante que se debe
ejecutar al término de la función llamada).
En la parte más alta del registro de activación se reserva el espacio para
almacenar el valor que debe devolver la función. Cuando termina la ejecución de
la función y se desapila su registro de activación, el stack pointer se
encuentra situado en la posición del primer argumento (arg0), de manera
que la función llamante puede obtener el resultado de la función llamada
accediendo a la posición ($sp-4).
Los argumentos de llamada de la función no forman parte de su registro de
activación sino que se encuentran encima de él. Como el compilador de Tinto
conoce el tamaño del registro de activación (32 bytes en el ejemplo de la
figura), puede acceder a estos argumentos mediante desplazamientos respecto al
frame pointer. Por ejemplo, el primer argumento (arg0) se encuentra en
la posición ($fp+32), el segundo argumento (arg1) se encuentra en la
posición ($fp+36) y el tercer argumento (arg2) se encuentra en la
posición ($fp+40).
|