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.

Utilización de registro

Aunque en el 68000 no es necesario utilizar esta alternativa, su codificación podría ser la siguiente:

Codificación de registro

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.

Posición de memoria

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:

Cuadro de posición de memoria

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.

Utilización de la pila

La evolución de la Pila en las secuencias de llamadas y vueltas sería la siguiente:

Secuencias de llamadas y vueltas

La estructura del código para el 68000 sería la siguiente:

Estructura del código de pila

Fuente: Estructura de Computadores, Facultad de Informática, UCM