CAPÍTULO 10 LAS INSTRUCCIONES DE DESPLAZAMIENTO Y MODIFICACIÓN DE LA MEMORIA

10.0 DEFINICIÓN DE DESPLAZAMIENTO (SHIFT) Y ROTACIÓN (ROTATE)


En muchos casos, las operaciones de los sistemas de control deben procesar un bit a la vez. Los datos a menudo están disponibles como una serie de bits y, a veces, las operaciones de bits secuenciales son la única forma de resolver un problema particular. Además de eso, para combinar bits en un campo, se necesitan instrucciones de desplazamiento y rotación. Todas las rutinas de multiplicación y división requieren la capacidad de mover bits entre sí en un campo completo de múltiples bytes. La instrucción de desplazamiento es aquella que toma un registro, como por ejemplo el Acumulador, y mueve todos sus bits 1 bit hacia la derecha ó 1 bit hacia la izquierda. A continuación, se muestran ejemplos de instrucciones de desplazamiento y rotación en la familia MCS650X:



Como se puede ver en el ejemplo, el mover los datos 1 bit a la derecha se llama desplazamiento a la derecha (shift right). La consecuencia natural del desplazamiento a la derecha es que el bit de entrada, o bit de orden superior en este caso, se establece en 0. Mover los datos en el registro 1 bit a la izquierda se llama desplazamiento a la izquierda (shift left). En este caso, el 0 se inserta en la posición de orden inferior. Estas son las dos capacidades de desplazamiento que existen en el microprocesador MCS650X.
Cabe señalar que, en ambos casos, el bit que se desplaza del registro, el bit de orden inferior en el desplazamiento a la derecha y el bit de orden superior en el desplazamiento a la izquierda, se almacena en la bandera de Acarreo. Esto es para permitir que el programador pueda consultar el bit por medio de las bifurcaciones por acarreo que están disponibles y también para permitirle a la capacidad de rotación la transferencia de bits en múltiples desplazamientos de precisión.
La segunda parte de la instrucción de desplazamiento de precisión múltiple es la rotación que se muestra en el ejemplo 10.1, en la que el valor del bit de Acarreo se convierte en el bit de orden inferior del registro, y el bit de salida del desplazamiento se almacena en el Acarreo.


10.1 LSR-DESPLAZAMIENTO LÓGICO A LA DERECHA


Esta instrucción desplaza al Acumulador o una ubicación de memoria específica 1 bit a la derecha, con el bit superior del resultado siempre establecido en 0, y el bit inferior, que se desplaza fuera del campo, se almacena en la bandera de Acarreo.


La notación simbólica para LSR es https://www.atariware.cl/archivos/mcs6500/ch10_01.webp


La instrucción de desplazamiento a la derecha afecta al Acumulador moviéndolo a la derecha 1 bit; es una instrucción de lectura/modificación/escritura que cambia una ubicación de memoria específica pero no afecta ningún registro interno. El desplazamiento a la derecha no afecta a la bandera de Desbordamiento. La bandera N siempre se borra. La bandera Z se establece en 1 si el resultado del cambio es 0, y de lo contrario se borra. El Acarreo se establece igual al bit de la entrada.
LSR es una instrucción de lectura/escritura/modificación y tiene los siguientes modos de direccionamiento: Acumulador; Página Cero; Página Cero, X; Absoluto; Absoluto, X.


10.2 ASL-DESPLAZAMIENTO ARITMÉTICO A LA IZQUIERDA


La instrucción de desplazamiento a la izquierda desplaza al Acumulador o a una ubicación de memoria 1 bit a la izquierda, con el bit 0 siempre establecido en 0 y el bit 7 asignado a la bandera de Acarreo. ASL desplaza el Acumulador 1 bit a la izquierda; es una instrucción de lectura/modificación/escritura que sólo afecta a la memoria.


La notación simbólica para ASL es https://www.atariware.cl/archivos/mcs6500/ch10_02.webp


La instrucción no afecta al bit de Desbordamiento; asigna el bit 7 del resultado (bit 6 en la entrada) a la bandera N; establece en 1 la bandera Z si el resultado es igual a 0, de lo contrario borra la bandera Z y almacena el bit 7 de la entrada en la bandera de Acarreo. ASL es una instrucción de lectura/modificación/escritura y tiene los siguientes modos de direccionamiento: Acumulador; Página Cero; Página Cero, X; Absoluto; Absoluto, X.


10.3 ROL-ROTAR A LA IZQUIERDA


La instrucción de rotación a la izquierda desplaza el Acumulador o la posición de memoria 1 bit a la izquierda, almacenando en el bit 0 la bandera de Acarreo y en la bandera de Acarreo el bit 7 de la entrada.


La notación simbólica para ROL es https://www.atariware.cl/archivos/mcs6500/ch10_03.webp


La instrucción ROL desplaza al Acumulador 1 bit a la izquierda y almacena el bit 0 del Acumulador en la bandera de Acarreo; no afecta en absoluto a los registros internos. Los conjuntos de instrucciones ROL almacenan en la bandera de Acarreo el bit de entrada 7, en la bandera Negativo el bit de entrada 6, y establece en 1 la bandera Z si el resultado de la rotación es 0; de lo contrario, borra la bandera Z sin afectar la bandera de Desbordamiento.
ROL es una instrucción de lectura/modificación/escritura y tiene los siguientes modos de direccionamiento: Acumulador; Página Cero; Página Cero, X; Absoluto; Absoluto, X.


10.4 ROR-ROTAR A LA DERECHA (Disponible para Microprocesadores fabricados a partir de Junio de 1976)


La instrucción de rotación a la derecha desplaza el Acumulador o la posición de memoria 1 bit a la derecha, almacenando en la bandera de Acarreo el bit 0 y la bandera de Acarreo en el bit 7.


La notación simbólica para ROR es https://www.atariware.cl/archivos/mcs6500/ch10_04.webp


La instrucción ROL desplaza al Acumulador 1 bit a la derecha y almacena la bandera de Acarreo en el bit 7 del Acumulador; no afecta en absoluto a los registros internos. Los conjuntos de instrucciones ROR almacenan en la bandera de Acarreo el bit de entrada 0, en la bandera Negativo la bandera de Acarreo, y establece en 1 la bandera Z si el resultado de la rotación es 0; de lo contrario, borra la bandera Z sin afectar la bandera de Desbordamiento.
ROR es una instrucción de lectura/modificación/escritura y tiene los siguientes modos de direccionamiento: Acumulador; Página Cero; Absoluto; Página Cero, X; Absoluto, X.

10.5 EL DIRECCIONAMIENTO POR ACUMULADOR


Como se indicó anteriormente, todas las instrucciones de desplazamiento pueden operar sobre el Acumulador. Este es un modo de direccionamiento especial que es exclusivo de las instrucciones de desplazamiento y opera con el siguiente conjunto de operaciones:


Ejemplo 10.2: Rotar el Acumulador a la Izquierda


CicloBus de DireccionesBus de DatosOperación InternaOperación Externa
1100OP CODEObtener Siguiente
OP CODE
Finalizar Operación Previa;
Incrementar PC a 101
2101Siguiente OP CODEObtener
OP CODE Descartado
Decodificar Instrucción Actual;
Almacenar Contador-P
3101Siguiente OP CODEObtener Siguiente OP CODEDesplazar a través del Sumador
4102?Obtener Segundo ByteAlmacenar resultado en A;
Interpretar el Siguiente OP CODE

Como podemos ver, las instrucciones del Acumulador tienen el mismo efecto que las instrucciones de un sólo byte no relativas a la Pila, en el sentido de que la instrucción contiene tanto el OP CODE como el registro en el que van las operaciones a realizar; por lo tanto, en el ciclo 2, el microprocesador contiene el Contador de Programa y en el ciclo 3, obtiene la misma ubicación del Contador de Programa e inicia la operación de la siguiente instrucción. Al mismo tiempo, se transfieren los resultados del sumador al Acumulador; esto se debe a la anticipación y características de segmentación (pipelining) de la familia MCS650X. El cambio del Acumulador y las operaciones de rotación toman 2 ciclos y sólo 1 byte de memoria.

10.6 INSTRUCCIONES DE LECTURA/MODIFICACIÓN/ESCRITURA


La familia de microprocesadores MCS650X tiene una serie de instrucciones que permiten al usuario cambiar el contenido de la memoria directamente con una sola instrucción. Estas incluyen todas las instrucciones de desplazamiento, rotación, incremento y decremento de la memoria. El funcionamiento de cada una de estas instrucciones es el mismo, en el sentido de que el modo de direccionamiento que se define para la instrucción se implementa de la misma manera que para las instrucciones normales. Después de que la dirección se ha calculado, se utiliza la dirección efectiva para leer la ubicación de la memoria en la unidad aritmética del microprocesador (ALU). La ALU realiza la operación y luego usa la misma dirección efectiva para volver a escribir los resultados en la memoria. La operación más difícil es el modo de direccionamiento Absoluto Indexado que se ilustra en el ejemplo 10.3 para la instrucción de rotación a la izquierda, ROL:


Ejemplo 10.3: Rotar Memoria a la izquierda, Usando Direccionamiento Absoluto, X


CicloBus de DireccionesBus de DatosOperación InternaOperación Externa
1100OP CODEObtener OP CODETerminar Opeeración Previa;
Incrementar PC a 101
2101ADLObtener ADLDecodificar instrucción actual, Incrementar PC a 102
3102ADHObtener ADHSumar ADL+X, Incrementar PC a 103
4ADH, ADL + X?Lectura FalsaSumar el Acarreo de la Suma previa a ADH
5ADH + C, ADL + XDatosObtener valor
6ADH + C, ADL + X?Destruir MemoriaEjecutar Rotación, Activar Escritura
7ADH + C, ADL + XDatos DesplazadosAlmacenar ResultadosEstablecer Banderas
8103OP CODEObtener Siguiente OP CODEIncrementar PC a 104

El ciclo 4 es un ciclo desperdiciado porque la instrucción de lectura/modificación/escritura debe esperar hasta que la bandera de Acarreo haya sido sumada al byte superior de la dirección para evitar escribir en una ubicación de memoria falsa. Esta es la misma lógica que se utiliza en la instrucción de almacenamiento, en la que el modo de direccionamiento con anticipación o atajo no es aprovechado. El ciclo 4 es una lectura intermedia, y el ciclo 5 es cuando se leen los datos reales con los que se va a operar.
Las líneas de dirección ahora mantienen esa dirección durante los ciclos 5, 6 y 7. El microprocesador señala tanto a sí mismo como para el mundo exterior esas operaciones durante el cual ignorará la línea RDY (Ready – listo). Lo hace estableciendo en 1 la línea R/W (Read/Write – Lectura/Escritura). La línea R/W se establece en 1 en el ciclo 6 porque se escriben datos en la ubicación de memoria en la que se volverá a escribir de nuevo en el ciclo 7, pero con datos correctos.
Debido a que los bits de datos leídos de la memoria deben modificarse y devolverse, no hay efecto de segmentación (pipelining) aparte de la superposición de la suma entre el byte inferior de la dirección y el registro Índice. Los 7 ciclos que se necesitan para ejecutar la instrucción de lectura/modificación/escritura en modo Absoluto Indexado, corresponden al peor caso en el tiempo para cualquier sección de la máquina a excepción de las interrupciones. Esta habilidad única de modificar la memoria directamente es quizás mejor ilustrada en el código del Ejemplo 10.4 que se usa para desplazar un número BCD de 4 bits, el que ha sido almacenado en los 4 bits superiores del Acumulador como parte de la operación de decodificación, desde el Acumulador a una posición de memoria. La figura 10.1 es un diagrama de flujo de este ejemplo. Ejemplos como este a menudo ocurren en terminales de punto de venta y otras máquinas en las que los datos BCD son ingresados secuencialmente. Este ejemplo asume que el valor se ingresa con el teclado, a través del cual los datos se introducen en el Acumulador de izquierda a derecha, pero tienen que ser desplazados en la memoria de derecha a izquierda. El valor del campo antes del desplazamiento es 1729, el que después del desplazamiento corresponderá a 17.295.



Ejemplo 10.4: Mover un Nuevo Número BCD a un Campo


AntesDespués
Campo00
00
17
29
00
01
72
95
Acumulador5000

Codificación


BytesInstrucciónComentario
2LDY 4
2 BUCLE-2LDX 4Configurar 4 movidas
1ASL A
3 BUCLE-1ROL Precio-1, X
1DEXDesplazar el campo 1 bit
2BNE BUCLE-1
1DEYDesplazar cuatro veces.
2BNE BUCLE-2
14 bytes

Hay varios conceptos nuevos introducidos en este ejemplo; el primero es el uso del registro Índice Y como un simple contador para contar el número de veces que el carácter ha sido desplazado 1 bit. El uso de desplazamiento de bits para cambiar los datos en la memoria, tal como se encuentra implementado en la familia MCS650X, es un enfoque común. El cambiar bits de un byte al siguiente usando sólo la instrucción ROL indexado es una muestra del poder que tiene la capacidad de comunicarse directamente con la memoria. Este ejemplo usa un bucle anidado; nótese que el bucle LOOP-1 ocurre 4 veces cada vez que ocurre el bucle LOOP-2. El bucle interno es muy importante en el sentido de que se ejecuta 16 veces en este caso; por lo tanto, se debe optimizar su tiempo de ejecución.
Además de tener la capacidad de desplazar y rotar, la familia MCS650X tiene la capacidad de incrementar y disminuir posiciones de memoria.


10.7 INC-INCREMENTAR EN UNO EL CONTENIDO DE UNA DIRECCIÓN DE MEMORIA


Esta instrucción suma 1 al contenido de la posición de memoria direccionada.
La notación simbólica es M + 1 → M.
La instrucción de incremento de memoria no afecta a ningún registro interno ni a las banderas de Acarreo ni de Desbordamiento. Si el bit 7 es activado como el resultado del incremento, la bandera Negativo se establece en 1; de lo contrario, se borra; si el incremento hace que el resultado sea 0, la bandera Z se establece en 1; de lo contrario, se borra.
Los modos de direccionamiento para la instrucción de incremento son: Página Cero; Página Cero, X; Absoluto; Absoluto, X.


10.8 DEC-DECREMENTAR EN UNO EL CONTENIDO DE UNA DIRECCIÓN DE MEMORIA


Esta instrucción le resta 1, en complemento a dos, al contenido de la posición de memoria direccionada.
La notación simbólica para esta instrucción es M – 1 → M.
La instrucción de decremento no afecta a ningún registro interno en el microprocesador. No afecta a las banderas de Acarreo ni Desbordamiento. Si el bit 7 es activado como resultado del decremento, entonces la bandera Negativo se establece en 1; de lo contrario, se borra. Si el resultado del decremento es 0, la bandera Z se establece en 1; de lo contrario, se borra. Los modos de direccionamiento para la instrucción de decremento son: Página Cero; Página Cero, X; Absoluto; Absoluto, X.
En muchos ejemplos a lo largo del informe, hemos utilizado la capacidad de incrementar y decrementar registros en los microprocesadores. La ventaja del incremento o decremento en memoria es que es posible mantener contadores externos o influir directamente en el valor de un bit por medio de estas instrucciones. A veces son útiles durante instrucciones de E/S.

10.9 NOTAS GENERALES SOBRE LAS INSTRUCCIONES DE LECTURA/MODIFICACIÓN/ESCRITURA


La capacidad de leer, modificar y escribir en la memoria es exclusiva de los microprocesadores de la serie MCS6500. La utilidad de las instrucciones está limitada únicamente por el enfoque del usuario al momento de organizar la Memoria. Aunque las instrucciones son bastante largas en ejecución, son significativamente más cortas que el tener que cargar y guardar otros registros para realizar la misma función. La experiencia a la hora de organizar programas para aprovechar esta manipulación de la memoria le permitirá al usuario apreciar plenamente el poder de estas instrucciones.