===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.
((https://www.atariware.cl/archivos/mcs6500/ch02_01.webp align=center))
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.
{{anchor href="LDA"}}
__**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 borra^^1^^; 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.)//
{{anchor href="STA"}}
__**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.
((https://www.atariware.cl/archivos/mcs6500/ch02_02.webp align=center))
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".
{{anchor href="ADC"}}
__**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.
((https://www.atariware.cl/archivos/mcs6500/ch02_03.webp align=center))
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.
{{anchor href="SBC"}}
__**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.
{{anchor href="AND"}}
__**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.
{{anchor href="ORA"}}
__**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%%
{{anchor href="EOR"}}
__**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%%