CAPÍTULO 2 EL BUS DE DATOS, EL ACUMULADOR Y LA UNIDAD ARITMÉTICA LÓGICA

2.0 EL BUS DE DATOS


Aunque la mayor parte de la siguiente discusión explica cómo operar un registro de propósito general llamado Acumulador, debe entenderse que los datos tienen que transferirse entre el Acumulador y las fuentes externas mediante el paso de datos desde el microprocesador a 8 líneas llamadas «bus de Datos». Las fuentes externas pueden ser el programa que controla el microprocesador, la memoria que se utilizará como almacenamiento temporal para los registros internos cuando éstos van a ser usados en la operación actual, y las comunicaciones reales al mundo exterior a través de puertos de entrada/salida. Más adelante en este documento se discutirá el rendimiento de las transferencias de datos desde y hacia cada uno de estos dispositivos. Sin embargo, en este momento, la discusión se centrará en el propio microprocesador.



La única función del bus de Datos es transferir datos entre la Memoria y los registros internos del procesador, como por ejemplo el Acumulador. La figura 2.1 muestra la comunicación básica entre el Acumulador A y la Memoria M, mediante el uso de 8 líneas de datos bidireccionales denominadas «bus de Datos».

2.1 EL ACUMULADOR


El Acumulador es un registro en el que se guardan los datos obtenidos de las operaciones realizadas. Todas las operaciones entre ubicaciones de Memoria deben ser realizadas por medio del Acumulador o uno de los registros índice auxiliares. El Acumulador se utiliza como almacenamiento temporal en el movimiento de datos de una ubicación de Memoria a otra. Por lo tanto, el principal uso para el Acumulador (A) es transferir datos desde y hacia la Memoria. Se pueden traer datos al Acumulador, realizar operaciones como AND/OR sobre él, comprobar los resultados de esas operaciones, establecer nuevos bits en él, o transferirlo de vuelta al mundo exterior. También sirve como almacenamiento temporal para una serie de operaciones, como la suma de 2 números: se carga uno de ellos en el Acumulador, se le suma el segundo, y los resultados obtenidos son almacenados en el mismo Acumulador. El Acumulador tiene dos funciones: la primera es ser uno de los principales puntos de almacenamiento de la máquina, y la segunda corresponde al lugar en el que normalmente se almacenan los resultados intermedios.



2.1.1 LDA-Cargar en el Acumulador el Contenido de una Dirección de Memoria


Cuando el microprocesador ejecuta la instrucción LDA, los datos se transfieren desde la memoria y los almacena en el Acumulador. En lugar de continuar dando una descripción verbal de la operación, presentaremos la representación simbólica M → A, donde la flecha significa «transferir a». Por lo tanto, la representación simbólica de la instrucción LDA se lee «Memoria transferida al Acumulador».
LDA afecta el contenido del Acumulador. No afecta a las banderas de Acarreo o Desbordamiento. Si como resultado de la operación LDA el Acumulador queda en cero, entonces la Bandera Cero se establece en 1. De lo contrario, se borra1; Si el bit 7 del Acumulador es un 1, la Bandera Negativo se establece en 1; de lo contrario, se borra.
Aunque todavía no desarrollamos el concepto de Modos de Direccionamiento, podemos decir que para fines de referencia LDA es una instrucción del «Grupo Uno» y dispone de los principales modos de direccionamiento, tal como se indica en el Apéndice A. Estos modos de direccionamiento son: Inmediato; Absoluto; Página Cero; Absoluto, X; Absoluto, Y; Página Cero, X; Indirecto Indexado; Indexado Indirecto.


1 En lo sucesivo se entenderá por «borrar» o «limpiar» una bandera a desactivarla o poner su valor en 0. Análogamente, se entenderá por «establecer» a activar o poner el valor de una bandera en 1. (N. del T.)



2.1.2 STA-Almacenar en una Dirección de Memoria el Contenido del Acumulador


Esta instrucción transfiere el contenido del Acumulador a una dirección de Memoria. La representación simbólica de esta instrucción es A → M. Esta instrucción no afecta a ninguna de las Banderas del procesador, ni al Registro de Estado ni tampoco al Acumulador. Es una instrucción del «Grupo Uno» y dispone de los siguiente modos de direccionamiento: Absoluto; Página Cero; Absoluto, X; Absoluto, Y; Página Cero, X; Indirecto Indexado; Indexado Indirecto.

2.2 LA UNIDAD ARITMÉTICA LÓGICA


Una de las funciones que cabe esperar de cualquier computador es la capacidad de calcular o realizar operaciones aritméticas. Incluso en un simple problema de control, resulta útil sumar 2 números para determinar si se ha alcanzado un valor, o restar 2 números para obtener un nuevo valor. Además, muchos problemas implican alguna forma rudimentaria de aritmética decimal o binaria: de hecho, muchas aplicaciones del microprocesador involucrarán ambas. La familia MCS650X tiene una Unidad Aritmética de 8 bits que interactúa con el Acumulador, tal como se muestra en la Figura 2.2.



La unidad aritmética se compone de varias partes. La más importante de estas es el circuito necesario para realizar una suma con complemento a dos entre valores paralelos de 8 bits y obtener un resultado binario de 8 bits paralelos, más un acarreo. En el Apéndice H se presenta una revisión de la aritmética binaria y decimal codificado en binario (BCD). Sin embargo, acá presentamos una explicación rápida del concepto «acarreo» (Carry): El rango más grande que se puede representar en un número de 8 bits es de 256, con valores que oscilan entre el 0 y el 255. Si sumamos 2 números cualesquiera que dan como resultado una suma mayor que 255, representamos el resultado del exceso sobre 255 usando un noveno bit adicional a los 8 bits. Este noveno bit se llama «acarreo».



2.2.1 ADC-Sumar al Acumulador el Contenido de una Dirección de Memoria, Con Acarreo


Esta instrucción suma al Acumulador el valor del contenido de una dirección de Memoria y el acarreo generado por la última operación; luego, almacena el resultado en el Acumulador.
La representación simbólica de esta instrucción es A + M + C → A.
Esta instrucción afecta al Acumulador. Establece en 1 la bandera Acarreo cuando la suma binaria es mayor a 255 o cuando la suma decimal es mayor a 99; de lo contrario, la borra. La bandera de Desbordamiento se establece en 1 cuando cambia el bit 7 (o signo) debido a que el resultado es mayor a +127 o menor a -128; de lo contrario, la borra. La bandera Negativo se establece en 1 si el resultado del Acumulador tiene el bit 7 establecido en 1; de lo contrario, borra la bandera Negativo. La bandera Cero se activa si el resultado a asignar al Acumulador es 0; de lo contrario, la borra.
Es una instrucción del «Grupo Uno» y dispone de los siguientes modos de direccionamiento: Inmediato; Absoluto; Página Cero; Absoluto, X; Absoluto, Y; Página Cero, X; Indirecto Indexado; Indexado Indirecto. El noveno bit del resultado se almacena en la bandera de Acarreo y los 8 bits restantes en el Acumulador. La bandera de Acarreo puede ser pensada como una bandera que se encuentra lejos del Acumulador pero que se ve directamente afectada por sus operaciones, tal como si fuera su noveno bit. La razón principal por la que no podemos considerar el bit de acarreo como un noveno bit en el Acumulador es porque uno puede controlar su estado por medio del programa, ya sea estableciéndolo (Asignándole «1») o borrándolo (Asignándole «0»). Y, por supuesto, no es considerado como parte de los 8 bits del Acumulador en las operaciones de transferencia de datos. A continuación, presentamos ejemplos empleando la operación Suma con Acarreo.


Ejemplo 2.1: Sumar Dos Números con Acarreo, Sin Generación de Acarreo


                 0000   1101     13 = (A)*
                 1101   0011    211 = (M)*
           __              1      1 = ACARREO
Acarreo = /0/    1110   0001    225 = (A)	

*(A) y (M) se refieren al «contenido» del Acumulador y al «contenido» de la Memoria, respectivamente.


Ejemplo 2.2: Sumar Dos Números con Acarreo, Con Generación de Acarreo


                 1111   1110    254 = (A)
                 0000   0110      6 = (M)
           __              1      1 = ACARREO
Acarreo = /1/    0000   0101      5 = (A)	

Dado que el Acumulador contiene «5» y la bandera de Acarreo le indica al usuario que el resultado excedió de 255, entonces el resultado puede interpretarse correctamente como 256 + 5 = 261.


2.2.1.0 Suma de Precisión Múltiple


Para realizar la suma de 2 números, se envía al microprocesador una instrucción ADC que suma la Memoria y el Acumulador, y almacena el resultado en el Acumulador con el bit de acarreo establecido en 1 si el resultado fue mayor a 255.
Para sumar números que tengan un valor significativamente mayor a 255, es necesario representarlos usando 2 números de 8 bits. De esta manera es posible representar números binarios mayores a 65.000. Para sumar dos números de 16 bits y así lograr doble precisión, primero se almacena el byte de orden inferior de uno de los números en el Acumulador, borramos la bandera de Acarreo y luego usamos el comando ADC para sumar el byte de orden inferior del segundo número al del primer número, que actualmente se encuentra en el Acumulador. Luego, se almacena este resultado en una dirección de Memoria utilizando el comando STA. La bandera de Acarreo ahora contiene el acarreo que se debe llevar desde el byte de orden inferior al byte de orden superior. Finalmente, se almacena en el Acumulador el byte de orden superior del primer número, se le suma con acarreo el byte de orden superior del segundo número, y se almacena esta suma en el byte de orden superior del resultado.
Así se puede ver que el acarreo nos permite realizar tanta aritmética de precisión como sea necesario. En la lista de ejemplos a continuación, se muestran los comandos utilizados para ejecutar la suma de dos números de 16 bits.


Ejemplo 2.3: Sumar Dos Números de 16 bits


               Byte de Orden Superior     Byte de Orden Inferior

Primer Número           H1                         L1
Segundo Número          H2                         L2
Resultado de la Suma    H3                         L3

LDA       L1         Cargar el byte de orden inferior del primer número
CLC                  Borrar bandera de Acarreo (Acarreo = 0)
ADC       L2         Sumar L1 al byte de orden inferior del segundo número
STA       L3         Almacenar el resultado en la Memoria. La bandera de Acarreo todavía 
                     se encuentra activa si es que la operación ADC la estableció en 1 en el paso anterior.
LDA       H1         Cargar el byte de orden superior del primer número
ADC       H2         Sumar H1 y el valor del acarreo de la primera operación ADC 
                     al byte de orden superior del segundo número
STA       H3         Almacenar el resultado en Memoria	

En este ejemplo fue necesario borrar la bandera de Acarreo antes de iniciar la instrucción de suma. Esto, por supuesto, significa que existen comandos que activan y borran la bandera de Acarreo, lo que permite sumar sin valores generados a partir de la operación anterior. Uno podría también, al final del programa, verificar si el resultado excedió los 16 bits consultando la bandera de Acarreo. El cómo uno altera y prueba exactamente las banderas será discutido en la Sección de Banderas y Bifurcaciones. Los ejemplos a continuación muestran el concepto de acarreo desde la suma de los bytes de orden inferior.


Ejemplo 2.4: Sumar Dos Números de 16 bits, Sin Acarreo Desde la Suma de Orden Inferior


          0000   0001   0000   0010    258
          0001   0000   0001   0000   4112

          Sumar bytes de orden inferior: (borrar acarreo)

                0000   0010  (A)
           __   0001   0000  (M)
Acarreo = /0/   0001   0010  (A)

Sumar bytes de orden superior (acarreo = 0):

                0000   0001  (A)
                0001   0000  (M)
           __             0  ACARREO
Acarreo = /0/   0001   0001  (A)

  Resultado =   0001   0001   0001   0010 = 4370	

Ejemplo 2.5: Sumar Dos Números de 16 bits, Con Acarreo Desde la Suma de Orden Inferior


          0000   0001   1000   0000    384
          0000   0000   1000   0000    128

          Sumar bytes de orden inferior: (borrar acarreo)

                1000   0000  (A)
           __   1000   0000  (M)
Acarreo = /1/   0000   0000  (A)

          Sumar bytes de orden superior: (acarreo = 1)

                0000   0001  (A)
                0000   0000  (M)
           __             1  ACARREO
Acarreo = /0/   0000   0010  (A)

   Resultado =  0000   0010   0000   0000 = 512	

2.2.1.1 Aritmética con Signos


Es posible ver de una manera diferente la operación suma y la forma en que los datos se representan en la memoria. Si en el problema de los 16 bits (Ejemplos 2.4 y 2.5) tuviéramos que trabajar con 15 bits de precisión (es decir, 15 bits de datos válidos) más 1 bit de signo (0 para positivo y 1 para negativo), sería posible realizar sumas binarias con signo sin tener que cambiar el sumador, sino simplemente cambiando la forma en que se interpretan los resultados. Para facilitar este concepto, el microprocesador tiene la capacidad de representar números positivos o negativos por medio de una bandera de signo que será discutida extensamente en la Sección 3.7. En la familia de procesadores MCS650X, el bit 7 es el bit de posición del signo. Esto significa que el byte de mayor orden en una serie de bytes debe tener el signo en la octava posición. Si por simplicidad hablamos de números de 8 bits con signo, significa que sólo se permiten 128 combinaciones para cada signo ya que ese es el número mayor que se puede representar con 7 bits, reservando el octavo bit, el bit más alto, para el signo.



En los siguientes ejemplos de aritmética con signos tenga en consideración que las operaciones están ocurriendo en números de 7 bits y que cualquier acarreo generado fuera de ese rango residirá en el octavo bit, y no en la bandera de Acarreo discutida durante las operaciones de suma. La generación de un acarreo fuera del rango de los 7 bits es la misma cuando se suman dos números de 8 bits, excepto por el hecho de que la bandera de Acarreo normal no reflejará correctamente el hecho de que el rango ha sido excedido. Esto se debe a que el verdadero acarreo de la suma de los dos números de 7 bits reside en la posición del bit de signo (bit 7). Por lo tanto, la bandera de Acarreo no tiene un significado real. En su lugar, contamos con una bandera separada, la bandera de Desbordamiento, utilizada para indicar cuando se ha producido un acarreo de 7 bits. Esta bandera le permite al usuario invocar programas de corrección. En cada ejemplo, los números negativos están en la forma de complemento a dos. También se incluirá en cada resultado el estado de las banderas de Acarreo y de Desbordamiento. La bandera de Desbordamiento se establece en 1 cada vez que el bit de signo (bit 7) cambia como resultado de la operación.


Ejemplo 2.6: Sumar Dos Números Positivos, Sin Desbordamiento


                0000   0101     +5 (A)
           __   0000   0111     +7 (M)
Acarreo = /0/   0000   0010    +12 (A)
                  __
Desbordamiento = /0/ Un "0" en el bit 7 indica un resultado positivo.
                     Tenga en cuenta que tanto la bandera de Acarreo como la de Desbordamiento permanecen limpias.	

Ejemplo 2.7: Sumar Dos Números Positivos, Con Desbordamiento


                0111   1111   +127  (A)
           __   0000   0010   +  2  (M)
Acarreo = /0/   1000   0001  "-127" (A)
                  __
Desbordamiento = /1/ Un "1" en el bit 7 indica resultado negativo, y el complemento a dos del resultado es 127; 
                     sin embargo, la bandera de Desbordamiento fue establecida, indicando que se excedió el rango permitido en la suma.	

El establecimiento en 1 del bit de posición 7 indica que obtuvimos un resultado negativo. Sin embargo, la bandera de Desbordamiento fue establecida en 1, por lo que el bit de posición 7 ahora representa un desbordamiento más allá del valor 127. Entonces, se debe informar al usuario que se produjo un resultado incorrecto y que se debe continuar con una rutina (programa) de corrección.


Ejemplo 2.8: Sumar Un Número Positivo y Uno Negativo, Con Resultado Positivo


                0000   0101   +5  (A)
           __   1111   1101   -3  (M)
Acarreo = /1/   0000   0010   +2  (A)
                  __
Desbordamiento = /0/ Un "0" en el bit 7 indica un resultado positivo.
                     (Recuerde que, aunque la bandera de Acarreo está establecida, 
                     no tiene ningún significado en las operaciones con números con signos.)	

Ejemplo 2.9: Sumar Un Número Positivo y Uno Negativo, Con Resultado Negativo


                0000   0101   +5  (A)
           __   1111   1001   -7  (M)
Acarreo = /0/   1111   1110   -2  (A)
                  __
Desbordamiento = /0/ Un "1" en el bit 7 indica un resultado negativo.	

Ejemplo 2.10: Sumar Dos Números Negativos, Sin Desbordamiento


                1111   1011   -5  (A)
           __   1111   1001   -7  (M)
Acarreo = /1/   1111   0100  -12  (A)
                  __
Desbordamiento = /0/ Un "1" en el bit 7 indica un resultado negativo.	

Ejemplo 2.11: Sumar Dos Números Negativos, Con Desbordamiento


                1011   1110     -66  (A)
           __   1011   1111     -65  (M)
Acarreo = /1/   0111   1101   "+125" (A)
                  __
Desbordamiento = /1/ Un "0" en el bit 7 indica resultado positivo, pero la bandera de Desbordamiento fue establecida en 1, 
                     indicando que se excedió el rango permitido en la operación.  Sin la indicación de desbordamiento, 
                     el resultado se interpretaría como +125. Sin embargo, el desbordamiento indica que el resultado fue negativo y 
                     que superó el valor -128. Por lo tanto, se informa al usuario que se produjo un resultado incorrecto, 
                     por lo que se debe continuar con una rutina de corrección.	

2.2.1.2 Suma Decimal


Existe una manera en que el usuario puede organizar los datos para sus operaciones en modo Decimal. Los microprocesadores de la familia MCS650X de MOS Technology, Inc. tienen un sumador modificado que le permite al usuario representar sus números como dos números decimales codificados en binario (BCD) de 4 bits, empaquetados en un sólo byte. Esta es una característica única de la familia MCS650X con la que se puede realizar la operación del siguiente ejemplo.


Ejemplo 2.12: Suma Decimal


CLC                  Limpiar bandera de Acarreo
SED                  Establecer el modo Decimal
LDA   0111   1001    79
ADC   0001   0100   +14
STA   1001   0011    93	

El sumador del microprocesador tiene la capacidad única de realizar correcciones en tiempo real al resultado binario esperado sin ninguna intervención por parte del programador. Otros microprocesadores populares requieren una instrucción separada (Ajuste Decimal) que corrige el resultado binario directamente en la Unidad Aritmética para obtener los mismos resultados finales que entrega este microprocesador.
Para hacer que la misma Unidad Aritmética funcione como un sumador binario o como un sumador decimal, el usuario debe elegir el modo en que va a operar (ya sea decimal o binario) estableciendo un flip-flop del microprocesador llamado bandera Decimal. Como se muestra en este ejemplo, uno no sólo inicializa el sumador borrando la bandera de Acarreo, sino que también poniendo el procesador en modo Decimal con la instrucción SED. Aunque esta operación requiere esta instrucción, es posible poner la máquina en modo Decimal una vez, al comienzo, y luego realizar muchas operaciones con números decimales sin ninguna intervención por parte del usuario.
La característica de «Ajuste decimal» en otros microprocesadores requiere programación adicional luego de cada operación binaria.


2.2.1.3 Resumen de las Sumas


En resumen, la Unidad Aritmética básica es un sumador binario que, bajo el control del comando ADC, realiza aritmética binaria entre el Acumulador y los datos, almacenando el resultado obtenido en el Acumulador. Dependiendo de la forma en que el usuario interprete los datos que son entregados al sumador y los resultados obtenidos, puede determinar si el resultado es mayor o no a 255 binario o 99 decimal; también puede realizar aritmética de precisión mediante el uso del noveno bit o la bandera de Acarreo; el usuario puede controlar que el microprocesador trabaje o no como un sumador decimal, por medio del establecimiento del modo Decimal; y puede representar sus números como números binarios con signo mediante el análisis de otras banderas que se establecen en la máquina.



2.2.2 SBC-Restar al Acumulador el Contenido de una Dirección de Memoria, Con Préstamo


Esta instrucción toma el valor actual del Acumulador, luego le resta el valor contenido en la memoria, luego le resta el préstamo (utilizando la aritmética del complemento a dos) y almacena el resultado obtenido en el Acumulador. El préstamo se define como el complemento de la bandera de Acarreo; por lo tanto, si la bandera de Acarreo es establecida en 1, esto significa que no ha ocurrido un préstamo.
La representación simbólica de esta instrucción es

        _
A - M - C → A.	

Esta instrucción afecta al Acumulador. La bandera de Acarreo se establece en 1 si el resultado obtenido es mayor o igual a 0. La bandera de Acarreo se borra cuando el resultado es menor que 0, lo que indica un préstamo. La bandera de Desbordamiento se establece en 1 cuando el resultado es mayor a +127 o menor que -127, de lo contrario se borra. La bandera Negativo se establece en 1 si el resultado en el Acumulador tiene el bit 7 activado, de lo contrario se borra. La bandera Cero se establece en 1 si el resultado en el Acumulador es 0, de lo contrario se borra. SBC es una instrucción del «Grupo Uno». Cuenta con los modos de direccionamiento Inmediato; Absoluto; Página Cero; Absoluto, X; Absoluto, Y; Página Cero, X; Indirecto Indexado; Indexado Indirecto. En una máquina binaria, la forma clásica de realizar operaciones aritméticas es por medio del uso de la notación complemento a dos. Al usar esta notación, cualquier operación de resta se convierte en una serie de complementos de bits y de sumas. Esto reduce la complejidad de los circuitos necesarios para realizar una resta. Cuando la instrucción SBC se usa en una resta de precisión simple, normalmente no habrá préstamo; por lo tanto, el programador debe establecer la bandera de Acarreo, usando la instrucción SEC, antes de usar la instrucción SBC. El microprocesador suma la bandera de Acarreo al complemento de los datos en la Memoria, lo que da como resultado un complemento a dos auténtico del valor contenido en la memoria, con su signo invertido.


Ejemplo 2.13: Restar Dos Números Con Préstamo, Con Resultado Positivo


Suponga que tenemos una resta de precisión simple, donde A contiene 5 y M contiene 3. La bandera de Acarreo debe establecerse en 1 usando la instrucción SEC, estableciendo así la condición de no tomar préstamos. El sumador cambia el signo de M tomando su complemento a dos: esto implica el complementar M y sumarle el bit de acarreo.


           M = 3   0000   0011
Complemento de M   1111   1100
     Sumar C = 1             1
          -M = -3  1111   1101	

El sumador suma «A» y el complemento a dos «-M». Esta operación ocurre simultáneamente con la operación complemento.


           A = 5   0000   0101
    Sumar -M = -3  1111   1101
     Acarreo = /1/ 0000   0010 = +2	

La presencia de la bandera de Acarreo después de esta operación indica que no se requirió préstamo; por lo tanto, el resultado es +2.


Ejemplo 2.14: Restar Dos Números Con Préstamo, Con Resultado Negativo


Suponga una resta de precisión simple, donde A contiene 5 y M contiene 6. Establecemos la bandera de Acarreo en 1 usando la instrucción SEC para indicar que operaremos sin préstamo.


           M = 6   0000   0110
Complemento de M   1111   1001
     Sumar C = 1             1
          -M = -6  1111   1010

           A = 5   0000   0101
    Sumar -M = -6  1111   1010
     Acarreo = /0/ 1111   1111 = -1	

La ausencia de la bandera de Acarreo después de esta operación indica que se requirió un préstamo. Por lo tanto, el resultado es un -1 en forma de complemento a dos. El resultado binario absoluto (sin signo) se obtiene tomando el complemento a dos de este número.


2.2.2.0 Suma de Precisión Múltiple


La resta de doble precisión se implementa de manera similar a la suma. A continuación, veamos un ejemplo de resta con números de 16 bits y almacenamiento del resultado en memoria:


Ejemplo 2.15: Restar Dos Números de 16 bits


               Byte de Orden Superior     Byte de Orden Inferior

Primer Número           H1                         L1
Segundo Número          H2                         L2
Resultado de la Resta   H3                         L3

SEC          Establecer la bandera de Acarreo
LDA    L1    Cargar el byte de orden inferior del primer número
SBC    L2    Restar a L1 el byte de orden inferior del segundo número, con préstamo
STA    L3    Guardar el resultado en Memoria
LDA    H1    Cargar el byte de orden superior del primer número
SBC    H2    Restar a H1 el byte de orden superior del segundo número, con préstamo
STA    H3    Guardar el resultado en Memoria	

Ejemplo 2.16: Resta en Formato de Doble Precisión, Con Resultado Positivo


Suponga una resta de doble precisión donde a 512 le restaremos 255. Como al comienzo de la resta todavía no tenemos ningún préstamo, debemos establecer la bandera de Acarreo. A continuación, se presentan los 2 números en forma binaria:


               Byte de Orden Superior     Byte de Orden Inferior

Campo A = 512        0000   0010                0000   0000
Campo M = 255        0000   0000                1111   1111

Dado que el sumador sólo puede operar con números de un sólo byte, el programador debe operar primero los bytes de orden inferior.

               M = 1111   1111
Complemento de M = 0000   0000
     Sumar C = 1             1
              -M   0000   0001

               A = 0000   0000
        Sumar -M = 0000   0001
    Acarreo = /0/  0000   0001

El acarreo se lleva a la operación de resta en los bytes de orden superior.

               M = 0000   0000
Complemento de M = 1111   1111
     Sumar C = 0             0
              -M   1111   1111

               A = 0000   0010
        Sumar -M = 1111   1111
    Acarreo = /1/  0000   0001

El resultado en forma binaria es el siguiente:
             
Acarreo = /1/      0000   0001   0000   0001 = +257	

La presencia de la bandera de Acarreo después de la resta de los bytes de orden superior indica que el número completo no requirió préstamo, por lo tanto, se trata de un número positivo en forma binaria directa.


Ejemplo 2.17: Resta en Formato de Doble Precisión, Con Resultado Negativo


Ahora suponga una resta de doble precisión donde a 255 debemos restarle 512. Nuevamente, como al comienzo de la resta todavía no se produce ningún préstamo, debemos establecer la bandera de Acarreo. A continuación, se presentan los 2 números en forma binaria:


               Byte de Orden Superior     Byte de Orden Inferior

Campo A = 255        0000   0000                1111   1111
Campo M = 512        0000   0010                0000   0000	

Operemos con el byte de orden inferior:


               M = 0000   0000
               _
               M = 1111   1111
     Sumar C = 1             1
    Acarreo = /1/  0000   0000  = -M

               A = 1111   1111
   Sumar -M = /1/  0000   0000
    Acarreo = /1/  1111   1111	

Acarreo = 1 indica que no hubo préstamo. El acarreo ahora se lleva a la resta de bytes de orden superior:


               M = 0000   0010
               _
               M = 1111   1101
     Sumar C = 1             1
                   1111   1110
                 
           _   A = 0000   0000
           M + C = 1111   1110
    Acarreo = /0/  1111   1110	

El resultado en forma binaria es:

Acarreo = /0/  1111   1110   1111   1111 = -257
             
Acarreo = /0/ indica la presencia de un préstamo; por lo tanto, el número es negativo y está en forma de complemento a dos.	

2.2.2.1 Aritmética con Signos


Los números con signos se pueden restar usando la instrucción SBC, tan fácil como cuando se suman. El microprocesador convierte los números en memoria a su forma complemento a dos y luego lo suma al valor del Acumulador tal como se hace en la resta sin signo descrita en la Sección 2.2.2. La operación de suma es idéntica a la descrita y a los ejemplos dados en la Sección 2.2.1.1.
Cabe recordar que antes de usar la instrucción SBC, ya sea con signo o sin signo, la bandera de Acarreo debe establecerse en 1 para indicar la condición de no préstamo. La bandera de Acarreo resultante no tiene ningún significado después de una operación aritmética con signo.


El microprocesador suma la bandera de Acarreo al complemento de los datos en Memoria, lo que da como resultado un complemento a dos auténtico de su valor con su signo invertido.


Esta instrucción toma el valor actual del Acumulador, luego le resta el valor de la Memoria, luego le resta el préstamo (utilizando la aritmética del complemento a dos) y almacena el resultado obtenido en el Acumulador. El préstamo se define como el complemento de la bandera de Acarreo; por lo tanto, si la bandera de Acarreo está en 1, significa que no ha ocurrido un préstamo.


2.2.2.2 Resta Decimal


Como se indica en la Sección 2.2.1.2, es posible representar números decimales como números BCD de 4 bits empaquetados. En este caso, que es exclusivo de este microprocesador, es posible hacer que el sumador actúe como si fuera un sumador decimal. En este caso, la función de la maquina es de corregir la resta de números positivos complementando el número, configurando el acarreo y realizando aritmética binaria con corrección automática justo en el momento en que el resultado es almacenado en el Acumulador. Las capacidades únicas de este sumador dan resultados como el que se muestra en el siguiente ejemplo.


Ejemplo 2.18: Resta Decimal


 SED                   Establecer modo Decimal
 SEC                   Establecer bandera de Acarreo
 LDA    0100   0100    44
 SBC    0010   1001    29
 STA    0001   0101    15	

Al establecer el modo Decimal y la bandera de Acarreo, uno puede restar 44 menos 29 obteniendo de manera automática en el Acumulador el resultado, 15.
Como se ha indicado, se pueden realizar sumas y restas cuando la máquina está configurada en modo Decimal, si tratamos los bytes que se sumarán como dígitos codificados en binario, positivos y sin signo. Además, la bandera de Acarreo representa, el caso de la suma, que el resultado es mayor a 99; y en el caso de la resta, su ausencia representa una situación de préstamo.


2.2.3 El Acarreo y el Desbordamiento Durante las Operaciones Aritméticas


Es necesario establecer o borrar la bandera de Acarreo antes de realizar cualquier instrucción aritmética. Dado que la bandera de Acarreo se establecer o se borra como resultado de la operación aritmética al final del bucle, se puede consultar el valor actual de la bandera para determinar si se produjo un acarreo o un préstamo en la operación. Mediante el uso adecuado de la bandera de Desbordamiento, se puede tratar el bit de orden superior de cualquier conjunto de bytes como un bit de signo, siempre y cuando los resultados de los números negativos se lleven a su forma de complemento a dos. El microprocesador también establece el flip-flop de Desbordamiento para indicar que se ha obtenido un resultado mayor al que se puede almacenar en un campo de 7 bits y cuando el signo resultante es incorrecto. En aritmética Binaria, el establecimiento de la bandera de Acarreo indica un resultado mayor a 256, y en aritmética Decimal, un resultado mayor a 99.
Aunque el acarreo de entrada es muy importante para estas operaciones, también lo es la siguiente regla: Establecer la bandera de Acarreo antes de restar, y borrarla antes de sumar.


2.2.4 Los Operadores Lógicos


Para implementar un sumador binario paralelo, se necesita varias funciones lógicas útiles que se agrupan en conjuntos. En la familia de los microprocesadores MCS650X, estos conjuntos son utilizados para implementar la lógica detrás de los operandos «AND», «OR» y «EOR» (O exclusivo). Estas operaciones se utilizan para probar y controlar manipulaciones de bits.



2.2.4.1 AND-»Y» Lógico Entre la Memoria y el Acumulador


La instrucción AND transfiere el Acumulador y la Memoria al sumador, el cual realiza una operación «Y» lógico bit a bit entre ambos, y almacena el resultado en el Acumulador.
Esta instrucción afecta al Acumulador; establece en 1 la bandera Cero si el resultado en el Acumulador es 0; de lo contrario, borra la bandera Cero; establece en 1 la bandera Negativo si el bit 7 del resultado en el Acumulador es igual a 1; de lo contrario, borra la bandera Negativo.
Esta operación se representa simbólicamente por A ∧ M → A.
AND es una instrucción del «Grupo uno», es decir, dispone de los modos de direccionamiento Inmediato; Absoluto; Página Cero; Absoluto, X; Absoluto, Y; Página Cero, X; Indirecto Indexado; Indexado Indirecto.
Uno de los usos de la operación AND es el de borrar un bit en la Memoria, como en el ejemplo a continuación:


Ejemplo 2.19: Borrar un Bit Usando la Instrucción «AND»


LDA    1100   X111, donde X es 0 ó 1
AND    1111   0111
STA    1100   0111	

Se carga un byte en el Acumulador y la instrucción AND borra el bit 3 del Acumulador. Luego, el Acumulador es almacenado de vuelta en la Memoria, reiniciando así el bit.



2.2.4.2 ORA-»O» Lógico Entre la Memoria y el Acumulador


La instrucción ORA transfiere el Acumulador y la Memoria al sumador, el cual realiza una operación «Y» lógico bit a bit entre ambos, y almacena el resultado en el Acumulador.
Esta operación se representa simbólicamente por A ∨ M → A.
Esta instrucción afecta al Acumulador; establece en 1 la bandera Cero si el resultado en el Acumulador es igual a 0; de lo contrario, la borra; establece la bandera Negativo en 1 si el bit 7 del resultado en el Acumulador es igual a 1; de lo contrario, la borra.
ORA es una instrucción del «Grupo Uno», es decir, dispone de los modos de direccionamiento Inmediato; Absoluto; Página Cero; Absoluto, X; Absoluto, Y; Página Cero, X; Indirecto Indexado; Indexado Indirecto.
La instrucción ORA se usa para establecer un bit en 1, tal como se muestra a continuación:


Ejemplo 2.20: Establecer un Bit Usando la Instrucción «OR»


LDA 1110 Xlll, donde X es 0 ó 1
ORA 0000 1000
STA 1110 1111	


2.2.4.3 EOR-»O exclusivo» Lógico Entre la Memoria y el Acumulador


La instrucción EOR transfiere el Acumulador y la Memoria al sumador, el cual realiza una operación «O exclusivo» lógico bit a bit entre ambos, y almacena el resultado en el Acumulador.
Esta operación se representa simbólicamente por A  M → A.
Esta instrucción afecta al Acumulador; establece la bandera Cero en 1 si el resultado en el Acumulador es 0; de lo contrario borra la bandera Cero; establece la bandera Negativo en 1 si el resultado en el Acumulador tiene el bit 7 establecido (bit 7 = 1); de lo contrario, borra la bandera Negativo.
EOR es una instrucción de «Grupo uno», es decir, tiene los modos de direccionamiento Inmediato; Absoluto; Página Cero; Absoluto, X; Absoluto, Y; Página Cero, X; Indirecto Indexado; Indexado Indirecto.
Uno de los usos de la instrucción EOR es calcular el complemento de un byte. Esto se logra a continuación, realizando un ORA entre el byte y ocho 1s.


Ejemplo 2.21: Complementar un Byte Usando la Instrucción «EOR»


LDA    1010  1111
EOR    1111  1111
       ----------
STA    0101  0000