MC 68000
En el 68000 los registros de activación se gestionan con las instrucciones LINK y UNLK, y contienen los cuatro campos siguientes:
1. parámetros reales de la llamada a la subrutina,
2. dirección de retorno de la subrutina,
3. puntero del registro de activación del subprograma padre
4. zona de variables locales.
El puntero al registro de activación actual se almacena en un registro de direcciones, que normalmente es el registro A6. El puntero de pila (SP) es el registro A7 y el puntero a las variables globales A5.
La instrucción LINK sirve para reservar la memoria correspondiente a un registro de activación y actualizar el puntero al mismo, es decir, para asignar y enlazar el registro de activación.
La instrucción UNLIK deshace el enlace y devuelve la memoria.
La instrucción LINK tiene el siguiente formato:
LINK An, #desplazamiento
An se usará como puntero al registro de activación, y el desplazamiento es un número entero negativo, cuya magnitud es el número de bytes que ocupan las variables locales. Su semántica es la siguiente:
An –> -(SP); SP –> An; SP + desplazamiento –> SP
Es decir:
1. Guarda el registro en la pila.
2. Copia el contenido del puntero de pila en el registro.
3. Suma el número negativo al puntero de pila, decrementando el puntero de pila un número de bytes igual al que ocupan las variables locales.
Teniendo en cuenta que en la pila están ya los parámetros y la dirección de retorno de la subrutina la ejecución de esta instrucción inmediatamente después de entrar en la rutina tiene el siguiente efecto:
- Guarda en la pila el puntero de registro de activación actual (A6), que contiene el puntero de registro de activación de la subrutina padre.
- Copia el puntero de pila en el puntero de registro de activación actual, que no varía durante la ejecución de la subrutina. Con esto se enlaza el registro de activación de la subrutina con el de la subrutina padre.
- Decrementa el puntero de pila reservando espacio para las variables locales de la subrutina.
La instrucción UNLK desasigna la zona de memoria local restituyendo el puntero de registro de activación de la subrutina padre. Tiene el siguiente formato:
UNLK An
An es el registro de direcciones que se ha usado como puntero de registro de activación. Su semántica es la siguiente:
An –> SP; (SP)+ –> An
Es decir:
1. Copia el contenido del registro en el puntero de pila.
2. Saca un palabra larga de la pila y la almacena en el registro.
La ejecución de esta instrucción antes del retorno de subrutina tiene el siguiente efecto:
- Copia en el puntero de pila el contenido del puntero del registro de activación actual. Con esto se libera la zona de variables locales de la pila.
- Saca de la pila el puntero de registro de activación de la subrutina padre y lo coloca como puntero de registro de activación actual. El puntero de pila queda apuntando a la dirección de retorno.
Fuente: Estructura de Computadores, Facultad de Informática, UCM