CAPÍTULO 5 TÉCNICAS DE DIRECCIONAMIENTO SIN ÍNDICES

5.0 TÉCNICAS DE DIRECCIONAMIENTO


Los modos de direccionamiento de la familia MCS6500 se pueden agrupar en dos categorías: direccionamiento Indexado y No Indexado. Esta sección se trata del modo de direccionamiento No Indexado. Antes de detallar los distintos modos disponibles para el usuario, se revisarán varios conceptos. Los primeros son Memoria, bus de Direcciones y bus de Datos. A continuación, se hará una breve introducción a dos modos de direccionamiento No Indexados, todo esto con la intención de preparar al lector para una discusión acerca de la secuencia del programa y la actividad interna del microprocesador durante la ejecución de una instrucción. Esto será seguido por una revisión de cómo uno trata la Memoria y su asignación a los elementos de la RAM, ROM y E/S.
Después de leer esta sección, el usuario comprenderá los siguientes conceptos:


  • Campo de Memoria
  • Bus de Direcciones
  • Bus de Datos
  • Temporización del Ciclo
  • Secuencia del Programa
  • Segmentación de Instrucciones (pipelining)

Con estas herramientas en mano, el lector estará mejor preparado para comprender las definiciones detalladas de los modos de direccionamiento no indexados.
Como se discutió en la Sección 1.1, la familia de microprocesadores MCS650X está organizada en base a una función de direccionamiento de 16 bits. Por medio de una palabra de 16 bits se puede acceder a todas las posiciones, aunque en el caso del MCS6503, el MCS6504 y el MCS6505, sólo se utilizan 11 ó 12 bits.
Dieciséis bits de dirección permiten el acceso a 65.536 ubicaciones de memoria, cada una de los cuales, en la familia MCS650X, consta de 8 bits de datos. La figura 5.1 muestra el campo de memoria total e incorpora el concepto de bus de Direcciones y bus de Datos. La dirección de memoria comprende 256 páginas (cada página definida por el byte de orden superior) de 256 ubicaciones de memoria (bytes) por página. Más adelante, en la discusión detallada de direccionamiento, se verá que la página de más bajo nivel, la Página Cero, tiene un significado especial en la minimización del código de programa y tiempo de ejecución.
Gran parte de la singularidad de la familia de productos MCS6500 tiene que ver con cómo se crea la dirección de 16 bits. La forma más sencilla de crear una dirección de 16 bits es que el programador le indique al microprocesador los 16 bits necesarios para acceder a un operando particular sobre el que se espera que éste trabaje. Una instrucción consta de 1, 2 ó 3 bytes. Siempre toma 1 byte el especificar la operación a realizar (OP CODE).
Este OP CODE es seguido por 0, 1 ó 2 bytes de dirección, dependiendo de la operación específica involucrada. En el caso de las instrucciones simples, como transferir el Acumulador a X, las operaciones se realizan internamente y, por lo tanto, no se necesitan bytes adicionales. Este modo de instrucción es conocido como «Implícito», en el sentido de que la instrucción contiene tanto el OP CODE como el origen y destino de la operación. Este es la forma más simple de direccionamiento y se aplica sólo a un número limitado de las instrucciones disponibles en la familia MCS6500. Otra forma de direccionamiento, el direccionamiento Absoluto, es el caso cuando el programador especifica directamente al microprocesador la dirección que quiere que use para buscar el valor de memoria sobre la que se producirá la operación. Esta manera se ilustra en el ejemplo de abajo.


Ejemplo 5.1: 5.1 Uso del Direccionamiento Absoluto


Ciclo de relojBus de DireccionesBus de Datos
10100LDA, Absoluto
20101ADL
30102ADH
4ADH, ADL Datos

En este ejemplo, la posición de memoria 0100 contiene el OP CODE «LDA Absoluto». La siguiente ubicación, 0101, contiene ADL, que se definirá como el «byte de orden inferior de la dirección», es decir, dirección baja (ADL). La ubicación 0102 contiene ADH, el «byte de orden superior de la dirección», es decir, dirección alta (ADH). En el siguiente ciclo de reloj, los 16 bits compuestos por ADH y ADL se colocan en el bus de Direcciones con la ubicación definida por ADH, ADL que contienen los datos a ser cargados en el Acumulador. La dirección efectiva de los datos es mejor descrita en la Figura 5.1, donde la dirección de 16 bits (AB00 a AB15) está compuesto por ADH y ADL.
Esta es la forma normal de una dirección de Memoria absoluta. El primer byte de la instrucción que es recogido por el Contador de Programa es el código de operación. Esto es interpretado por el microprocesador como «Cargar A – Absoluto». Al mismo tiempo que Cargar A está siendo interpretado por el microprocesador, éste accede a la siguiente ubicación de memoria poniendo el contenido del Contador de Programa, que se incrementó cuando se obtuvo el OP CODE, en el bus de Direcciones.

5.1 LA SEGMENTACIÓN DE INSTRUCCIONES (PIPELINING) Y LA SECUENCIA DEL PROGRAMA


Se le llama segmentación (pipelining) a la ejecución de 2 tareas simultáneas. En este ejemplo, el obtener la siguiente ubicación de memoria, y la interpretación los datos actuales. Con la segmentación se minimiza el tiempo normal de operación de una instrucción de 2 ó 3 bytes. Es esta característica la que permite que una instrucción de 2 bytes sea interpretada en sólo 2 tiempos de reloj, y una instrucción de 3 bytes en 3 ciclos de reloj.
En los microprocesadores de la familia MCS650X, un ciclo de reloj se define como una operación completa de cada uno de los relojes de 2 fases. La Figura 5.2 es un esquema de la dirección y sincronización del bus de Datos en relación con los relojes del sistema.
El punto principal a tener en cuenta es que cada ciclo de reloj en el microprocesador MCS650X es un ciclo de memoria en el que ésta se lee o se escribe. Simultáneamente con la lectura o escritura de memoria, también está ocurriendo otra operación interna del microprocesador.




El siguiente ejemplo nos permitirá analizar este efecto:


Ejemplo 5.2: Demostración de la Segmentación de Instrucciones (Pipelining)


Ciclos de RelojOperación externaDirecciónDatosOperación interna
1Obtener OP CODE100ADC Incrementar contador P a 101
2Obtener primera mitad de la dirección de Memoria101ADLIncrementar contador P la dirección de Memoria a 102, Interpretar instrucción ADC
3Obtener segunda mitad de la dirección de Memoria102ADHIncrementar contador P a 103; guardar ADL
4Obtener operando de la MemoriaADH, ADLDatosCargar datos
5Obtener el siguiente OP CODE de la Memoria103STA Incrementar el contador P a 104, Realizar operación ADC: A + M + C
6Obtener dirección de la Memoria104ADL Incrementar contador P a 105, Resultado de Sumar → Acumulador, Interpretar instrucción STA

El ejemplo anterior muestra la operación de la instrucción ADC, suma con acarreo, utilizando direccionamiento Absoluto. En el primer ciclo, el OP CODE es obtenido de la memoria direccionada por el Contador P. Para implementar la segmentación en el ciclo dos, se realiza la búsqueda de la dirección inferior ADL simultáneamente con la interpretación de la instrucción ADC absoluto. Al final del ciclo 2, como resultado de la interpretación del modo de direccionamiento Absoluto, el microprocesador sabe que debe acceder a la siguiente posición de memoria para obtener la dirección superior.
La dirección inferior (ADL) se almacena en la ALU mientras que la dirección superior (ADH) se obtiene en el ciclo 3.
En el cuarto ciclo no es necesaria ninguna operación interna, mientras el microprocesador pone el valor calculado en el bus de Direcciones. Sin embargo, durante este ciclo, el operando se carga en el microprocesador.
Los 4 ciclos han estado involucrados con el acceso a la Memoria para la operación ADC, una instrucción absoluta. El primer ciclo en buscar la instrucción, el segundo en buscar la dirección inferior, el tercero en buscar la dirección superior y el cuarto para obtener el operando usando la dirección calculada. Debido a que eso completa las operaciones de memoria de esta instrucción, durante el quinto ciclo el microprocesador obtiene la siguiente instrucción desde la memoria, mientras completa la operación suma de la primera instrucción. Durante el sexto ciclo, el microprocesador interpreta la nueva instrucción obtenida durante el ciclo 5, mientras transfiere el resultado de la operación suma al Acumulador. Esto significa que, a pesar de que al microprocesador le toma 6 ciclos el ejecutar la instrucción ADC, el programador sólo necesita preocuparse de los primeros 4 ciclos, ya que los siguientes 2 se superponen, tal como se muestra.
Todas las instrucciones toman al menos 2 ciclos: uno para obtener el OP CODE y otro para interpretarlo. El número de ciclos que tarda una instrucción casi siempre es igual al número de veces que la memoria debe ser direccionada.

5.2 UTILIZACIÓN DE LA MEMORIA


Tal como se indicó anteriormente, una dirección de 16 bits le permite al usuario acceder a más de 65.000 posiciones de memoria. La mayoría de las posiciones a las que accederá en el curso de un problema de control estarán en ubicaciones referenciadas por el programa o por el Contador P. Un programa típico probablemente tendrá una extensión de entre 1000 y 8000 bytes, y normalmente se implementará en ROM o en ROM no volátil modificable.
Un segundo tipo de memoria es la memoria de lectura-escritura, en la que el el usuario guarda datos tales como valores de trabajo o datos de entrada y salida. Dependiendo del tipo de problema que se aborde, esta memoria RAM tiene una extensión de entre 32 y 8000 bytes, aunque la mayoría de las aplicaciones usarán menos de 2000 bytes de RAM.
Parece que hay un espacio significativo de direcciones que la mayoría de las aplicaciones no utiliza. Para obtener el máximo beneficio del espacio de direccionamiento, se implementan 2 conceptos en la familia MCS6500. Estos son: el uso de datos direccionamiento como control de E/S, y conexiones de direcciones distribuidas para tener un mínimo de líneas de control. El último concepto utiliza el bus de Direcciones, que es básico y, por lo tanto omnipresente en cualquier sistema de microcomputadora, como una red controladora, siempre que sea posible. Un ejemplo de esto es el uso del bus de Direcciones en la selección de dispositivos para interactuar con el microprocesador.


5.2.1 CONTROL DE E/S


Las ventajas de acceder a los dispositivos de E/S como si fueran posiciones de memoria son: 1) el uso del espacio de direcciones distribuido permite tener líneas de control de E/S simples, y 2) todo el poder de las instrucciones se aplica a las operaciones de E/S. Esto tiene la ventaja de minimizar el hardware de E/S y permite al programador ser innovador en la aplicación de dispositivos de E/S para resolver su problema.
Todos los dispositivos de E/S de la familia de productos MCS6500 tienen registros de 8 bits que son direccionados por el microprocesador como si fueran un byte de memoria. En el caso más simple, el registro de 8 bits que se lee contiene un patrón de 1s y 0s que corresponde al nivel de voltaje TTL aplicado a los 8 pines de entrada del dispositivo de E/S.
Si el registro es un flip-flop que maneja 8 pines de salida con niveles TTL, el almacenar 8 bits de datos con una instrucción STA en ese registro de E/S se está programando este flip-flop a un estado deseado específico. Por lo tanto, uno puede usar las instrucciones con los dispositivos de E/S como si fueran cualquier otra posición de memoria.


5.2.2 ASIGNACIÓN DE MEMORIA


La figura 5.1 muestra la relación entre la Memoria, el bus de Direcciones y el bus de Datos. Se usa la notación hexadecimal para los valores de dirección. La sección anterior se ocupó de la utilización del espacio de direcciones de la memoria no sólo ROM y RAM, sino también para dispositivos de E/S. Por el momento, se considerará el concepto de asignación del campo de memoria de la Figura 5.1. La asignación que viene a continuación, satisface la mayoría de los requisitos de las aplicaciones y representa una asignación óptima para minimizar el código de programación y mejorar la velocidad.


Dirección HexadecimalAsignación de Memoria Sugerida
0000 – 3FFFRAM
4000 – 7FFFE/S
8000 – FFFFROM

Cabe señalar que los 3 bloques de memoria abordan definiciones que, si bien no son obligatorios ni requeridos para el correcto funcionamiento del sistema, representan una asignación lógica de espacio. La justificación para esta particular asignación se presentará en la Sección 9.12. Mientras tanto, el lector debe recordar los conceptos de bloques de memoria asignados para RAM, E/S y ROM, ya que son útiles en la siguiente discusión. Con una comprensión de la segmentación (pipelining) y el concepto de asignación de memoria, el siguiente tema debe ser: ¿De qué manera se puede acceder a los datos del campo de memoria?

5.3 DIRECCIONAMIENTO IMPLÍCITO


El direccionamiento implícito corresponde a una instrucción de un sólo byte.
El byte contiene el OP CODE que estipula una operación interna del microprocesador. Las instrucciones que utilizan este tipo de direccionamiento incluyen operaciones que borran y establecen bits en el registro P (estado del procesador), incrementar y decrementar registros internos y transferir el contenido de un registro interno a otro. Las operaciones de este tipo tardan en ejecutarse 2 ciclos de reloj. El primer ciclo es el de obtención del OP CODE y durante esta búsqueda, el Contador de Programa se incrementa.
En el segundo ciclo, el Contador P incrementado corresponde ahora a la dirección del siguiente byte de la instrucción. Sin embargo, dado que el OP CODE define totalmente la operación, la segunda búsqueda de memoria no tiene sentido y se suprime el incremento del Contador P.
Durante el segundo ciclo, el OP CODE se decodifica con el reconocimiento de su operación de un solo byte.
En el tercer ciclo, el microprocesador repite la misma dirección para obtener el siguiente OP CODE. Esta es la segunda vez que se busca la dirección de memoria: la primera vez como el segundo byte de la primera instrucción y la segunda, como la dirección correcta del OP CODE de la siguiente instrucción.
A continuación, se proporciona una representación simbólica de una instrucción de 2 ciclos. «PC» significa «Program Counter», o sea, Contador de Programa.


Ejemplo 5.3: Ilustración del Direccionamiento Implícito


Ciclos de RelojBus de DirecciónContador de ProgramaBus de DatosComentarios
1PCPC + 1OP CODEObtener OP CODE
2PC + 1PC + 1Nuevo OP CODEIgnorar Nuevo OP CODE;
Decodificar viejo OP CODE
3PC + 1PC + 2Nuevo OP CODEObtener Nuevo OP CODE;
Ejecutar Viejo OP CODE

Las instrucciones que usan el direccionamiento Implícito y que requieren sólo 2 ciclos son: CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, SEC, SED, SEI, IMPUESTOS, TAY, TSX, TXA, TXS, y TYA.
Las instrucciones que usan direccionamiento Implícito y que requieren más de 2 ciclos son las operaciones de la Pila: BRK, PHA, PHP, PLA, PLP, RTI, RTS.

5.4 DIRECCIONAMIENTO INMEDIATO


El direccionamiento Inmediato corresponde a una instrucción de 2 bytes.
El primer byte contiene el OP CODE que especifica la operación y el modo de direccionamiento. El segundo byte contiene una constante cuyo valor es conocido por el programador. A menudo es necesario comparar la carga y/o la prueba con ciertos valores conocidos. En lugar de requerir que el usuario defina y cargue las constantes en alguna parte de la memoria RAM, el microprocesador le permite al usuario especificar valores que le sean conocidos por medio del modo de direccionamiento Inmediato.


Ejemplo 5.4: Ilustración del Direccionamiento Inmediato


Ciclos de RelojBus de DirecciónContador de ProgramaBus de DatosComentarios
1PCPC + 1OP CODEObtener OP CODE
2PC + 1PC + 2DatosObtener datos, Decodificar OP CODE
3PC + 2PC + 3Nuevo OP CODEBuscar nuevo OP CODE, Ejecutar Viejo OP CODE

El direccionamiento inmediato es la forma más simple de manipulación de constantes disponible para el programador. Requiere un tiempo mínimo de ejecución en el sentido de que se usa un ciclo para cargar el OP CODE y a medida que éste se interpreta, se recupera la constante.
Las instrucciones que utilizan el direccionamiento Inmediato son ADC, AND, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA y SBC.

5.5 DIRECCIONAMIENTO ABSOLUTO


El direccionamiento Absoluto corresponde a una instrucción de 3 bytes.
El primer byte contiene el OP CODE que especifica la operación y el modo de direccionamiento. El segundo byte contiene el byte de orden inferior de la dirección efectiva (la dirección que contiene los datos), mientras que el tercer byte contiene el byte de orden superior de la dirección efectiva. Así, el programador especifica la dirección completa de 16 bits y, dado que se puede direccionar cualquier posición de memoria, se le considera un modo de direccionamiento típico. Otros modos pueden considerarse subconjuntos especiales de este modo de direccionamiento de 16 bits.


Ejemplo 5.5: Ilustración del Direccionamiento Absoluto


Ciclos de RelojBus de DirecciónContador de ProgramaBus de DatosComentarios
1PCPC + 1OP CODEObtener OP CODE
2PC + 1PC + 2ADLObtener ADL, Decodificar OP CODE
3PC + 2PC + 3ADHObtener ADH, Guardar ADL
4ADH, ADLPC + 3DatosObtener datos
5PC + 3PC + 4Nuevo OP CODEBuscar Nuevo OP CODE, Ejecutar Viejo OP CODE

Este es el funcionamiento básico del microprocesador en el modo de direccionamiento Absoluto: En el primer ciclo, lee el OP CODE mientras termina la operación anterior. En el segundo ciclo, el microprocesador lee automáticamente el primer byte a continuación, del OP CODE (en este caso, la dirección inferior) mientras interpreta el código de operación. Al final de este ciclo, el microprocesador sabe que necesita un segundo byte para la secuencia del programa; por lo tanto, se accederá un byte adicional usando el Contador de Programa mientras se almacena la dirección inferior. Esto ocurre durante el tercer ciclo. En el cuarto ciclo, la operación se toman la dirección inferior y la superior que se leyeron durante los ciclos 2 y 3 para direccionar el operando. Por ejemplo, en la instrucción LDA (Cargar la memoria en el Acumulador), la dirección efectiva se utiliza para obtener desde la memoria el dato que se va a cargar en el Acumulador. En el caso del almacenamiento, los datos se transfieren desde el Acumulador a la memoria direccionada.
Como se ilustró en la sección de segmentación de instrucciones (pipelining), dependiendo de la instrucción, es posible que el microprocesador inicie el ciclo de recuperación de la siguiente instrucción a continuación, de la operación de dirección efectiva e independiente de cuántos ciclos internos más puede tomar el completar el OP CODE. La única excepción es el caso del «Salto Absoluto» en que el byte inferior y superior de la dirección, que se obtienen en los ciclos 2 y 3, son utilizados como la dirección de 16 bits del siguiente OP CODE. Por lo tanto, el salto Absoluto sólo requiere de 3 ciclos. En todos los demás casos, el direccionamiento Absoluto toma 4 ciclos: 3 para obtener la instrucción completa, incluida la dirección efectiva, y el cuarto para realizar la transferencia de memoria solicitada en la instrucción.
El direccionamiento Absoluto siempre ocupa 3 bytes de memoria del programa: uno para el OP CODE, otro para el byte inferior de la dirección, otro para el byte superior, y 1 byte de memoria de datos (como la RAM) a la que apunta la dirección efectiva.
Las instrucciones que tienen capacidad de direccionamiento Absoluto son: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, JMP, JSR, LDA, LDX, LDY, LSR, ORA, ROL, SEC, STA, STX, y STY.

5.6 DIRECCIONAMIENTO DE PÁGINA CERO


El direccionamiento de Página Cero corresponde a una instrucción de 2 bytes. El primer byte contiene el OP CODE, mientras que el segundo byte contiene la dirección efectiva de la memoria en la Página Cero.
Como se ve en el direccionamiento Absoluto, la capacidad de direccionar cualquier lugar en el espacio de memoria de 65K cuesta 3 bytes de espacio de programa, más un mínimo de 4 ciclos para realizar las operaciones de direccionamiento. Para permitir al usuario un acortamiento tanto del espacio de memoria utilizado como del tiempo de ejecución, particularmente cuando se trata de registros de trabajo y valores intermedios, la familia de microprocesadores MCS650X provee de un modo de direccionamiento especial que asume automáticamente el byte superior de la dirección efectiva (ADH) para poder estar en la página más baja de la memoria. Para entender el concepto de página, uno debe pensar en cada una de las direcciones de memoria que comprende un bloque consecutivo de 256 ubicaciones y que tienen una dirección independiente de alto orden asociada a ese bloque. Cada bloque se llama página. El microprocesador presta poca atención al concepto de página, excepto en el caso de la Página Cero y los cálculos de direcciones indexadas que se tratará en las siguientes secciones.
El microprocesador asume que el byte de orden superior de la dirección efectiva, para instrucciones que contienen OP CODES que usan la opción de direccionamiento de Página Cero, es ceros (ADH = 00, hexadecimal). Esto permite que ocurra la siguiente secuencia.


Ejemplo 5.6: Ilustración del Direccionamiento de Página Cero


Ciclos de RelojBus de DirecciónContador de ProgramaBus de DatosComentarios
1PCPC + 1OP CODEObtener OP CODE
2PC + 1PC + 2ADLObtener ADL, Decodificar OP CODE
300, ADLPC + 2DatosObtener datos
4PC + 2PC + 3Nuevo OP CODEBuscar nuevo OP CODE, Ejecutar Viejo OP CODE

En el primer ciclo, el microprocesador apaga el Contador de Programa, lee el OP CODE e incrementa el Contador de Programa. En el segundo ciclo, el microprocesador apaga el Contador de Programa, lee el byte inferior de la dirección efectiva, interpreta el OP CODE e incrementa el Contador de Programa. Hasta ahora, las operaciones son idénticas a las descritas en el modo de direccionamiento Absoluto. Sin embargo, al final del segundo ciclo, el microprocesador ha identificado que se trata de una operación de Página Cero y en el siguiente ciclo devuelve 00 como byte superior de la dirección efectiva, junto con la dirección inferior que acaba de obtener y luego, dependiendo del OP CODE, lee o escribe en esa posición de memoria.
La ventaja del direccionamiento de Página Cero es que sólo requiere 2 bytes: uno para el OP CODE y otro para el byte inferior de la dirección efectiva. A diferencia del direccionamiento Absoluto, que toma 3 bytes y 4 ciclos, este direccionamiento sólo toma 3 ciclos: 1 para obtener el OP CODE, otro para obtener el byte inferior de la dirección, y otro para obtener los datos.
Para hacer la utilización de este concepto aún más efectiva, el usuario debe organizar la memoria de modo que los valores más frecuentemente utilizados se encuentran en la RAM entre las posiciones de memoria 0 y 255. Si uno organiza correctamente la Página Cero, incluido el traslado de datos a estas ubicaciones para bucles más largos, se puede obtener un acortamiento significativo del código del programa y su tiempo de ejecución.
El concepto de Página Cero es tan importante que diversos cross assemblers4 tienen anotaciones de error que indican cuando se hace un uso inadecuado de este espacio. Si la codificación está organizada de acuerdo con las pautas que se muestran en la Sección 5.2.2, normalmente encontrará almacenamiento de trabajo ubicado entre los valores del 0 al 255. Este es un aspecto importante de la disciplina conocida como «gestión de la memoria».


4 Un «cross assembler» es un ensamblador que se ejecuta en una computadora con un tipo de procesador, pero que genera un código objeto que será utilizado en una computadora con otro tipo de procesador.


Una vez que se convierte en hábito el patrón de codificación de la familia MCS650X, que considera almacenamiento de trabajo o registros en la Página Cero, uno se percata de que, en la mayoría de las aplicaciones de control, todos los registros de trabajo tomarán ventaja de esta técnica de programación y la reducción de tiempo asociada sin ningún esfuerzo adicional por parte del usuario.
Las instrucciones que permiten el direccionamiento de Página Cero son: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, LDA, LDX, LDY, LSR, ORA, ROL, SBC, STA, STX, y STY.

5.7 DIRECCIONAMIENTO RELATIVO


Como se discutió en la Sección 4.1, todas las operaciones de bifurcación en el microprocesador utilizan el concepto de Direccionamiento Relativo. En el ejemplo 5.7, se puede apreciar que para el caso del salto directo en que la bifurcación no se toma, en el primer ciclo del Contador de Programa, el microprocesador lo muestra como si fuera una dirección, obtiene el OP CODE y finaliza la operación anterior. Durante el segundo ciclo, se pone el Contador de Programa en el bus de Direcciones, obteniendo el desplazamiento (offset) relativo. Internamente, el microprocesador decodifica el OP CODE para determinar que se trata de una instrucción de bifurcación.


Ejemplo 5.7: Ilustración del Direccionamiento Relativo, Cuando No Se Toma una Bifurcación


CicloBus de DirecciónBus de DatosOperación ExternaOperación Interna
10100OP CODEObtener OP CODEFinalizar Operación Anterior, Incrementar el Contador de Programa a 101
20101DesplazamientoObtener DesplazamientoInterpretar Instrucción, Incrementar Contador de Programa a 102
30102Siguiente OP CODEObtener Siguiente OP CODEVerificar banderas, Incrementar Contador de Programa a 0103

Este es sólo el segundo ciclo de una operación interna. Por lo tanto, el microprocesador puede estar almacenando un valor calculado en la instrucción anterior al mismo tiempo que está terminando de interpretar la presente instrucción. las banderas en la máquina se establecen físicamente mientras se realiza la operación de almacenamiento; por lo tanto, el microprocesador le permite al Contador de Programa avanzar un ciclo más para darse tiempo y determinar el valor de la banderas. Por ejemplo, si la instrucción anterior es ADC, las banderas no se establecen hasta el ciclo en el que se obtiene el valor del desplazamiento.
Durante el tercer ciclo, el microprocesador pone el PC incrementado en el bus de Direcciones, obtiene el siguiente OP CODE y verifica la bandera para decidir si el valor del Contador de Programa que está saliendo es correcto y que no se va a tomar la bifurcación. Al obtener el siguiente OP CODE en una secuencia de bifurcación, se logra la implementación de un salto relativo sin toma de bifurcación. Esto corresponde a un tipo adicional de segmentación (pipeline) que requiere 2 ciclos. En un ciclo se obtiene el OP CODE de la bifurcación, y en el otro ciclo se obtiene la siguiente operación, es decir, el valor del desplazamiento relativo. En virtud del hecho de que no se toma la bifurcación, se ignora efectivamente la segunda búsqueda de instrucción, así que la ubicación del Contador de Programa ya se ha incrementado y el siguiente OP CODE ya ha sido obtenido por el microprocesador. Si en el ejemplo anterior suponemos que la bandera está configurada de tal manera que se toma la bifurcación y el desplazamiento relativo es +50, el microprocesador requerirá un tercer ciclo para realizar la operación de bifurcación.


Ejemplo 5.8: Ilustración del Direccionamiento Relativo, Cuando Se Toma una Bifurcación Positiva; Sin Cruce de Límite de Página


CicloBus de DirecciónBus de DatosOperación ExternaOperación Interna
10100OP CODEObtener OP CODEFinalizar operación anterior, Incrementar el Contador de Programa a 101
20101+50Obtener desplazamientoInterpretar instrucción, Incrementar el Contador de Programa a 102
30102Siguiente OP CODEObtener Siguiente OP CODEVerificar Banderas, Agregar relativo a PCL, Incrementar el Contador de Programa a 103
30152Siguiente OP CODEObtener Siguiente OP CODETransferir los resultados a PCL, Incrementar el Contador de Programa a 153

En el ejemplo 5.8, en el primer ciclo, se obtiene un OP CODE de bifurcación mientras la operación anterior termina. En el segundo ciclo se obtiene el desplazamiento mientras se interpreta la instrucción de bifurcación. En el tercero ciclo, el microprocesador utiliza el sumador para sumar el byte inferior del Contador de Programa al desplazamiento y también comprueba las banderas. Debido a que el valor de la secuencia del programa del siguiente OP CODE ya se encuentra en el Contador de Programa, y está siendo incrementado, el microprocesador puede permitir que continúe el proceso de incremento. Si el valor de la siguiente instrucción se indica porque la bandera no ha sido establecida en 1, entonces el microprocesador carga el siguiente OP CODE e ignora la suma entre el byte inferior del Contador de Programa y el desplazamiento, tal como se mostró en el ejemplo anterior.
Si durante el tercer ciclo la bandera tiene el valor correcto para tomar la bifurcación, se ignora el OP CODE que se ha obtenido durante este ciclo. Luego el microprocesador actualiza el Contador de Programa con el resultado de la suma y coloca este valor en el bus de Direcciones, lo que le permite obtener el nuevo OP CODE.
Esto da el efecto de una bifurcación de 3 ciclos. En caso de que no se tome, el microprocesador tiene una bifurcación efectiva de 2 ciclos, es decir, de 2 referencias de memoria. Cuando se toma la bifurcación, ésta toma 3 ciclos siempre y cuando el valor relativo no obligue a una actualización del byte superior del Contador de Programa. En otras palabras, se requieren 3 ciclos si no se cruza el límite de la página (Recuerde la discusión del concepto de «página» en la Sección 5.0). Si en el ejemplo anterior, en vez de 50 posiciones hacia adelante, el salto hubiera sido 50 posiciones hacia atrás de la dirección 0102, se habría producido el siguiente resultado:


Ejemplo 5.9: Ilustración del Direccionamiento Relativo, Cuando Se Toma una Bifurcación Negativa; Con Cruce de Límite de Página


CicloBus de DirecciónBus de DatosOperación ExternaOperación Interna
10100OP CODEObtener OP CODEFinalizar Instrucción Anterior
20101-50Obtener DesplazamientoInterpretar Instrucción
30102Siguiente OP CODEObtener Siguiente OP CODEVerificar Banderas, Sumar Relativo a PCL
401B2Dato DescartadoObtener Dato DescartadoAlmacenar Sumador en PCL y Restar 1 a PCH
500B2Siguiente OP CODEObtener Siguiente OP CODEPoner Nuevo PCH e Incrementar PC a 00B3

En este ejemplo, el sumador se usa para realizar la operación aritmética, pero sólo 8 bits a la vez. La bifurcación negativa cruza el límite de la página; por lo tanto, se desarrolla un resultado intermedio de 01B2, el que no tiene valor intrínseco debido al préstamo que ahora tiene que reflejarse en el byte superior del Contador de Programa. Dado que este ejemplo muestra tanto un desplazamiento negativo como el cruce del límite de una página, se requiere una explicación adicional.
El valor al que se sumará el desplazamiento es 0102 (hexadecimal). El desplazamiento propiamente tal es -50 (hexadecimal).


Restar el byte de orden inferior:

        02    = 0000 0010
          HEX 
        50    = 0101 0000
          HEX

Complemento a dos de 50:
        __
        50    = 1010  1111
      Sumar 1            1
          -50 = 1011  0000
         
     Sumar 02   0000  0010
          -50 = 1011  0000
Acarreo = /0/   1011  0010
 
                  B    2	

Hasta el momento PCH no ha sido afectado; por lo tanto, el valor en el bus de Direcciones es 01B2.


Acarreo = 0 indica un préstamo.


Restar el byte de orden superior:

       01    = 0000  0001
         HEX
       00    = 0000  0000
         HEX

Complemento a dos de 00:
         _____
         00    = 1111  1111
           HEX
 Sumar Acarreo =          0
        -00    = 1111  1111
           HEX
         
      Sumar 01   0000  0001
           -00   1111  1111
 Acarreo = /1/   0000  0000
 
                   0    0	

La presencia del Acarreo indica que no hay préstamo. Por lo tanto, se trata de un resultado positivo.


En este momento, luego de la operación aritmética de ambos bytes del PC, el bus de Direcciones será 00B2.
El microprocesador pone en el bus de Direcciones el resultado intermedio (01B2), leyendo así una ubicación dentro de la página en la que está actualmente trabajando, pero ignorando su valor. Luego resta 1. En el caso de un salto hacia la página siguiente, el microprocesador suma 1 al byte superior del Contador de Programa. En el quinto ciclo, el microprocesador reconoce que tiene el byte superior e inferior correcto del nuevo Contador de Programa, por lo que es capaz de iniciar una nueva operación de instrucción, dando así una longitud efectiva de 4 ciclos a la operación de bifurcación cuando se cruza el límite de una página.
Cabe señalar que todas las operaciones anteriores son automáticas; una vez que se encuentra una instrucción de bifurcación, el siguiente valor relativo es calculado y puesto en la posición de memoria después de la instrucción.
Sin embargo, podemos ver que es posible controlar el tiempo de ejecución de una bifurcación. Esto es importante para contar o estimar los tiempos de ejecución de las operaciones. Para fines de conteo, se aplica lo siguiente:


Si la bifurcación no se toma normalmente, asuma 2 ciclos.


Si la bifurcación se toma normalmente pero no cruza el límite de la página, asuma 3 ciclos.


Si la bifurcación está sobre el límite de una página, asuma 4 ciclos.


En bucles que se repiten muchas veces, se puede asumir algún tipo de factor estadístico entre 3 y 2, ó 4 y 2, dependiendo de la probabilidad de tomar la bifurcación versus no tomarla.
Para indicar al programador cuando se toma la bifurcación de 4 ciclos en vez de la de 3 ciclos, los diversos ensambladores marcan todas las operaciones de bifurcación que cruzan los límites de una página con un mensaje de advertencia; y si el tiempo es importante, el usuario tal vez pueda reubicar su programa de tal una manera de que la bifurcación no cruce el límite de la página.
Se debe volver a enfatizar que, excepto para fines de cálculos de tiempo, el programador puede ignorar los cruces de límites de página. En resumen, el direccionamiento relativo siempre ocupa 2 bytes: Uno para el OP CODE y otro para el desplazamiento.


El tiempo de ejecución es el siguiente:


Bifurcación no tomada — 2 ciclos


Bifurcación tomada, sin cruce de página — 3 ciclos


Bifurcación tomada, con cruce de página — 4 ciclos


Solo las instrucciones de bifurcación tienen direccionamiento relativo. Las instrucciones de bifurcación son: BCC, BEQ, BIT, BMI, BNE, BPL, BSC, BVC y BVS. Para una explicación más detallada de los cálculos de desplazamiento relativa, se remite al lector al Apéndice H.