APENDICE G DISCUSIÓN: DIRECCIONAMIENTO INDIRECTO

Los microprocesadores de la familia MCS650X tienen una forma especial de direccionamiento conocida como Indirecto. El artículo sobre direccionamiento Indirecto describe su funcionamiento básico.
La intención de esta discusión es familiarizar al usuario con algunos de los usos y aplicaciones del direccionamiento Indirecto.
La dirección Indirecta es en realidad una dirección que se habría codificado en línea tal como en el caso del direccionamiento Absoluto, excepto por el hecho de que la dirección no se conoce en el momento en que el usuario escribe el programa. Como se ha indicado varias veces en el cuerpo básico de la documentación, con la organización de la familia MCS650X es significativamente más eficiente asignar direcciones e implementarlas si se conoce la estructura de direccionamiento. Sin embargo, esto no siempre es posible. Por ejemplo, para minimizar la codificación de una subrutina o un código de propósito general, a menudo es deseable trabajar con un rango de direccionamiento que no es posible cubrir en un índice normal, o en el caso de una subrutina donde es necesario que las direcciones sean variables dependiendo de qué parte de todo el programa llame a la dirección.
Probablemente sea esta discusión la que mejor amplifica la necesidad de tener direcciones calculadas. Debería ser bastante obvio para el usuario que una subrutina de propósito general no puede contener la dirección de las operaciones. Por lo tanto, en lugar de tener la instrucción LDA seguida del valor que el programador quiere cargar, en una subrutina puede ser deseable hacer una Load A desde una dirección calculada o especificada.
El uso del modo de direccionamiento Indirecto es brindarle al usuario una ubicación en la Página Cero en la que se pueda colocar la dirección calculada. Luego, la instrucción de subrutina puede llamar a esta dirección calculada usando la forma Load A desde una dirección señalada por el siguiente byte en la secuencia del programa. La palabra «indirecto» técnicamente proviene del hecho de que en lugar de tomar la dirección que sigue inmediatamente a la instrucción, el siguiente valor en la secuencia del programa es un puntero a la dirección.
De ahora en adelante nos referiremos al puntero Indirecto como IAL, porque es una dirección de Página Cero y, por lo tanto, es un byte de orden inferior. Las instrucciones indirectas están escritas en el formato «Load A» seguido de IAL. IAL apunta a una dirección que se ha almacenado previamente en la Página Cero.
Esto le da al usuario la posibilidad de dirigirse a cualquier lugar de la memoria usando una dirección calculada. Sin embargo, el valor real del direccionamiento no está solo en que sea Indirecto, sino en la capacidad de ser modificado. Esta es la razón por la cual se implementa la instrucción indexada indirecta en lugar de la instrucción indirecta. En la Sección 6.5 se trata un ejemplo de indexación indirecta en subrutinas, pero debe tenerse en cuenta que la instrucción indexada indirecta debe usarse siempre que el usuario no conozca la dirección exacta en el momento de la compilación. Aunque puede haber otros usos interesantes y esotéricos de la instrucción de índice indirecto, ésta es la más común.
La segunda forma de direccionamiento Indirecto es muy poderosa para ciertos tipos de aplicaciones. El Capítulo 11 muestra el uso de tablas que tienen punteros y la ventaja de recorrer una tabla de punteros hasta encontrar una coincidencia y luego usar el mismo índice para dirigirse a una segunda tabla para realizar otra operación. Este es el tipo de arquitectura de procesador de pila clásico, pero requiere una disciplina especial en el momento en que se define originalmente un programa. Ambos direccionamientos indirectos requieren un concepto de gestión de memoria que no es obvio para el programador novato.
El concepto de direccionamiento Indirecto indexado es que la memoria debe verse como una serie de tablas, en las que el acceso a un conjunto de ellas se logra mediante la indexación a través de una lista de punteros. Se puede buscar en un conjunto de tablas para realizar algún tipo de prueba u operación. Luego, se utiliza el mismo índice para procesar otro conjunto de punteros. Este concepto sólo es aplicable a operaciones en las que se presta servicio a una variedad de insumos. Una aplicación clásica es cuando varios dispositivos remotos están siendo gestionados por el mismo programa de control. Un ejemplo podría ser tener tres teletipos conectados a un dispositivo, cada teletipo se controla manualmente y puede estar bajo el control del programa del usuario. En este tipo de entorno de manejo de mensajes, el programa de control para los teletipos no hace más que recopilar cadenas de datos del dispositivo de entrada y luego realiza operaciones en la cadena al ver una señal de control, generalmente un retorno de carro en el caso del teletipo. Debido a que cualquiera de los teletipos puede causar cualquier serie de operaciones, este programa no se presta bien al concepto de direccionamiento Absoluto. De hecho, la mayoría de las subrutinas que se ocupan del procesamiento individual deberían escribirse de forma independiente. Esto normalmente permite añadir más dispositivos sin pagar ninguna penalización en términos de programación. Por lo tanto, esta es una subrutina o un tipo de operación no absoluta en la que la indexación indirecta no se aplicaría porque cada una de las diversas operaciones utiliza una función de posición. En otras palabras, se pueden asignar una serie de tablas que apunten al propio teletipo; otro conjunto que apunta a un flujo de mensajes salientes y otro conjunto que apunta a una serie de tablas que mantienen el estado del dispositivo. Cada uno de estos punteros se considera una dirección individual al comienzo de una cadena. Cada cadena tiene una longitud variable. Las cadenas de teletipo pueden consistir en un mensaje de tres caracteres seguido de un retorno de carácter o un mensaje de 40 caracteres seguido de un retorno de carácter. En la familia MCS650X este sistema se implementará mediante el desarrollo de una serie de punteros indirectos. Cada teletipo tendrá un puntero indirecto. Su puerto de E/S tiene otro puntero indirecto que apunta a la cadena guardada, otro que apunta a la cadena de salida del mensaje de teletipo y otro que apunta a su tabla de estado. Si todos los teletipos funcionan de esta manera, se puede ver que la codificación para poner datos en la tabla de mensajes de entrada es la misma para todos los teletipos y es totalmente independiente del teletipo en el que se almacenan los datos.
El registro de índice X sirve como control para las tablas, de modo que si todas las tablas estuvieran organizadas secuencialmente, X señalaría el valor adecuado para cada operación. Una operación de ejemplo podría ser: leer el teletipo tres, transferir los datos al registro de entrada del teletipo tres, actualizar el contador del teletipo tres, verificar que el teletipo tres todavía esté activo y decidir si regresar o no a la señal del teletipo tres. La codificación para realizar cada una de estas operaciones sería exactamente la misma que la codificación para el teletipo dos, si las tablas estuvieran organizadas de manera que X fuera un registro Índice para los punteros.
Este es el tipo de aplicación de manipulación de cadenas para la que se diseñó el modo Indirecto Indexada y sólo cuando se puede organizar un programa para esta técnica es que se utiliza en su máximo potencial. Las ventajas de organizarse para este tipo de enfoque son significativas cuando el problema requiere manipulación de cadenas; El programa completo de E/S ocupa aproximadamente la mitad de la memoria y un cuarto del tiempo de ejecución de varios otros microprocesadores que no tienen esta característica del modo Indirecto Indexado.