Control de la dirección de vuelta
Para hacer que la dirección de vuelta de una subrutina sea siempre la siguiente a la de la instrucción que realiza la llamada se pueden utilizar las siguientes alternativas:
1) Utilización de un registro
Se trata de una alternativa fácil de implementar y rápida en su ejecución, sin embargo, impide el anidamiento y la recursión.
Aunque en el 68000 no es necesario utilizar esta alternativa, su codificación podría ser la siguiente:
2) Utilización de una posición de memoria de la subrutina
Esta alternativa exige que antes de bifurcar a la subrutina se ponga la dirección de vuelta en una posición de memoria perteneciente a la subrutina (por ejemplo, la primera). El retorno se realiza con un salto incondicional e indirecto sobre esta posición.
Esta alternativa permite un número ilimitado de llamadas anidadas, pero no permite la recursión.
En el 68000 codificaríamos esta alternativa llevando el contenido de la posición de memoria a un registro de direcciones y realizando para implementar la vuelta un salto indirecto sobre él:
3) Utilización de una pila (stack)
Inmediatamente antes de realizar la bifurcación a la subrutina se coloca la dirección de retorno en la pila. Lo último que realiza la subrutina es recuperar esta dirección de retorno y llevarla al contador de programa.
Esta alternativa permite el anidamiento y la recursión porque resuelve el orden de los retornos con el orden de inserción y extracción que impone la Pila. Se vuelve a la instrucción siguiente a la última llamada porque de la pila siempre se extrae el último retorno almacenado.
En el 68000 existen dos instrucciones que realizan las dos acciones descritas:
JSR D1
bifurca a D1 almacenando previamente la dirección de la instrucción siguiente en la Pila
RTS
lleva el último retorno introducido en la Pila al PC.
La evolución de la Pila en las secuencias de llamadas y vueltas sería la siguiente:
La estructura del código para el 68000 sería la siguiente:
Fuente: Estructura de Computadores, Facultad de Informática, UCM