Beruflich Dokumente
Kultur Dokumente
Introducción
El siguiente informe explica la resolución del primer proyecto grande de programación del a CPUCR en el curso de
Estructuras de Computadores Digitales I, el cual se basa en crear un programa principal que llame a tres subrutinas para
realizar diferentes tareas.
La primer subrutina actúa sobre un grupo de números en BCD sin signo y de doble precisión almacenados en una
sección de memoria (@3000 en adelante), esta subrutina debe sumar todos los números (5 como máximo) y el resultado
debe quedar en el tope de la pila al retornar de la subrutina.
La segunda subrutina también actúa sobre un grupo de datos ubicados después de la dirección @4000, estos
números (10 como máximo) son representados en complemento 2 de triple precisión, esta subrutina le resta todos los
números a cero y el resultado, que es de precisión 4, debe quedar en el tope de la pila al retornar de la subrutina.
Finalmente la subrutina 3 procesar un grupo de números (31 como máximo) representados en signo magnitud de
doble precisión que se encuentran a partir de la dirección @5000, esta subrutina expresa todos los números en complemento
2 y los resultados los coloca en la misma posición que los números originales.
Se realizará una breve descripción de como solucionar cada problema basado en diagramas de flujo del algoritmo a
emplear, todo esto se hace por separado para cada subrutina. Finalmente se unirá todo y se presentará la inicialización de la
memoria junto con las variables definidas para resolver los problemas junto con las llamadas de cada subrutina.
Subrutina 1.
• Descripción de la solución: Para resolver este problema hay que sumar las unidades (Palabra Baja) y decenas
(Palabra Alta) de cada número BCD y además hay que tomar en consideración que se pueden producir centenas. Se
debe tomar en cuenta que para realizar operaciones en BCD los números utilizados solo van de 0 a 9 como se
muestra en la tabla 1. El problema que genera este tipo de operación es que se
Binario BCD debe realizar una corrección en el resultado obtenido a la hora de sumar los
0 0 números en binario porque con 4 bits se pueden obtener resultados desde cero
1 1 hasta 16 pero la respuesta debe quedar entre 0 y 9 por lo tanto luego de obtener el
resultado de cada suma se debe verificar lo siguiente:
10 2
11 3 1. Si el resultado de la suma de los cuatro bits genera un acarreo implica que hay un
100 4 desborde y se debe corregir el resultado, esto se logra sumándole 6 (0110) al
101 5 resultado y el acarreo se suma al bit que le sigue en mayor orden significativo.
110 6 Ejemplo:
111 7 7 0111
1000 8 +9 +1001
16 10000 → en este caso ocupo que el resultado en BCD sea 0001 =1 y
1001 9 0110 = 6 para formar la el resultado 16.
Tabla 1. Código Binario-BCD
2. Si el resultado de la suma no produce un acarreo entonces al número se le resta 12 de forma que si es mayor o
igual a nueve produzca un acarreo:
7 0111
+8 +1000
15 1111 → en este caso ocupo que el resultado en BCD sea 0001 =1 y 0101 = 5 para formar la el resultado
15 entonces tengo que corregirlo, para darme cuenta de esto a nivel de instrucciones lo que hago es que le
resto 12:
15 → 1111
-12 → +0100
10011 → Como produjo un acarreo entonces se que es un número mayor a nueve por lo que
simplemente le sumo 6 al resultado y el acarreo se lo sumo al bit más significativo.
Para el caso de la CPUCR por trabajar en 6 bits (CPUCR1) tengo que solo los primeros 4 bits serán tomados como
parte del numero de doble precisión (parte baja o alta) por lo que luego de sumarlos en la CPUCR se utiliza el
comando ROL y CLC para depositar el acarreo, si es que se produce; en la bandera C del registro de estado con el
fin de utilizar saltos condicionales. Luego de verificar que el resultado de la suma tiene una forma valida de
representación en BCD se aumentan los punteros creados para recorrer la tabla y se disminuye la cantidad de
palabras en 1 por cada pasada completa que se realice. Tanto la palabra baja, alta y el acarreo del resultado se van
almacenando en una sección de memoria que se utiliza como apoyo para los resultados parciales de cada suma.
Estos apuntadores al final de la subrutina se incrementan de diferente forma, ya que los punteros de las palabras
baja y alta se aumentan finalmente en dos para indicar los campos donde se almacenará el resultado y luego de
colocar las unidades y decenas en su lugar el puntero de la palabra alta se aumenta en uno más con el fin de colocar
las centenas luego de las decenas.
• Diagrama de flujo.
Inicio
Si
C=0
Reste 12
Si
C=0
Reste 12 Si
C=0
N=0
FIN Si
Incremente punteros en dos, ponga unidades
y decenas al final de la tabla, incremente PA
en uno y ponga centenas.
Subrutina 2.
• Descripción de la solución: Para resolver este problema hay que restarle a cada número cero y sumarlos pero es lo
mismo que sumar todos los números y al final restarle cero, que es equivalente a complementar la suma final. Lo
que hago entonces es sumar todos los números en complemento 2 y al final complemento el resultado, el cual debe
de quedar en el tope de la tabla de datos. Así el algoritmo de sumar dos números con doble precisión usado en la
subrutina 1 me puede servir, solo que ahora tengo números de precisión 3. En general, lo que se hace es sumar la
palabra baja del número, si produce acarreo este se suma a la palabra media (PM) y sino entonces solo se coloca el
resultado en la región temporal de memoria para almacenar el resultado parcial de la suma de las palabras bajas y
se procede a realizar el mismo procedimiento con la palabra media, luego la alta y finalmente como el resultado
hay que darlo con una precisión de 4 la suma de los acarreos generados es colocada en esta posición.
• Diagrama de flujo:
Inicio
Si
Sume PM del número apuntado por C=0
Aumente en 1 la palabra
apuntador a PM en memoria temporal y
media del número en
almacene el resultado en posición temporal
posición temporal de memoria.
de memoria
Si
C=0
Aumente en 1 la palabra alta del
número en posición temporal
Sume PA del número apuntado por
de memoria.
apuntador a PA en memoria temporal y
almacene el resultado en posición temporal
de memoria
Aumente en 1 la palabra de acarreo
del número en posición
Si temporal de memoria.
C=0
• Descripción de la solución: esta subrutina se encarga de pasar a complemento 2 los números ubicados en una tabla
a partir de la posición @5000, lo que se hace es crear dos punteros que recorran toda la tabla, uno para la parte baja
y otro para la parte alta del número, además de uno que traiga la cantidad de números que se van a procesar, sus
direcciones son pasadas a la subrutina por medio de la pila y ya dentro de ella se obtiene el dato de de cada parte
del número, primero la parte baja, se complementa, se incrementa y se devuelve al mismo lugar de donde se trajo,
ahora; si luego de procesar el número aparece un acarreo (C=1) este se debe sumar a la parte alta y se complementa
el resultado para luego ser depositado de donde se obtuvo pero si no se genera un acarreo (C=0) entonces
simplemente se procede a complementar la parte alta del número, se incrementan los punteros de dos en dos para
acceder al siguiente número si la cantidad total de números que se encuentra en memoria temporal no ha llegado a
0, de lo contrario se apilan la dirección de retorno y se termina la ejecución.
• Diagrama de flujo:
Inicio
Si
C=0
Tome PA del número apuntado por
apuntador a PB en memoria temporal,
Complemente en incremente. Almacene Aumente en 1 la palabra alta
resultado en posición original de memoria del número en posición
de la PA temporal de memoria.
Decremente un 1 cantidad
Total de números FIN
N=0
Para la descripción del programa objeto se tomaran impresiones de pantalla de la ejecución antes y después de
implementar la ejecución de diferentes secciones de cada subrutina.
• Subrutina 1: Para la subrutina 1 es importante notar ciertos cambios importantes como por ejemplo los saltos
condicionales, resultados particulares y los retornos de subrutina. La ubicación de esta subrutina es la siguiente:
1. Saltos condicionales: en esta sección se presenta como se determina si un número es mayor a nueve o no en la
sección UNIDADSUM1 que es donde se operan las unidades del número en BCD. Por ejemplo en esta parte el
número que se encuentra en memoria temporal es @1107, y el que se va a operar con este es @0510, cuando
se suman @07 con @10 el resultado en BCD debe ser 1 en decenas y 5 en unidades, pero la suma produce
@17 como se ve en la figura 1.1 pero no se genera un acarreo entonces saco el bit 5 (de 6) de la palabra
rotándola de forma que el acarreo quede en la bandera C y se de el salto condicional inmediato para restarle
12, en el acumulador queda el numero @74 luego de rotarlo como se puede ver en la figura 1.2 y se procede a
restarle 12 para determinar si el número es mayor a 9 lo que producirá un acarreo evitará que se haga un salto
a ALMACENE y se pase a restarle 6 al número para corregirlo, pero esta resta se hace en la suma original si
rotar que estaba en el acumulador (fig 1.4), luego se ordena el número y se almacena en la parte baja temporal
de las unidades como se ve el cambio en la figura 1.5.
2. Posiciones finales de memoria: El resultado final se almacena en el tope de la tabla de datos, para este caso
muy específico se van a operar solo los dos números que se presentaron antes, en la figura 1.6 se puede ver la
memoria antes de correr el programa y la memoria después de correr el programa en la figura 1.7 donde el
resultado se encuentra entre las posiciones @3005 a @3007 siendo esta última posición las centenas.
• Subrutina 2: para la subrutina 2 se tienen situaciones similares a las de la subrutina 1 con respecto a los saltos
condicionales. La ubicación de esta subrutina es la siguiente:
2. Posiciones finales de memoria: El resultado final se almacena en el tope de la tabla de datos, para este caso
muy específico se van a operar solo los dos números que se presentaron antes, en la figura 2.4 se puede ver la
memoria antes de correr el programa y la memoria después de correr el programa en la figura 2.5 donde el
resultado se encuentra entre las posiciones @4007 a @40012 siendo esta última posición del acarreo.
1. Saltos condicionales: en este caso los saltos condicionales se llevan acabo entre operaciones de complemento
sobre la palabra paja y alta de cada número, porque si el complemento 2 de la parte baja genera un acarreo este
se debe sumar a la parte alta de la palabra. Por ejemplo, se pasan dos números al programa, el primero es
@0700 y el otro es @7143, en la figura 3.1 se muestra como al complementar la parte baja de la palabra del
numero @0700 y sumarle 1 se genera un acarreo lo que provoca que se tenga que sumar uno a la parte alta del
número y luego se complementa (figura 3.2 y 3.3 ) dando como resultado @67
Figura 3.3
2. Posiciones finales de memoria: como resultado final se obtienen los números en en la posición original de
cada dato expresados en complemento 2 para este caso (dos números); en la figura 3.4 se puede ver la
memoria antes de correr el programa y la memoria después de correr el programa en la figura 3.5.
Figura 3.4. Memoria antes de correr el programa. Figura 3.5. Memoria después de correr el programa.
Anexo
Código fuente:
*=@0000
*=@1570
SUB1 PLA ;..organizacion de direcciones
STA @0750 ; parte baja de retorno de subrtna.
PLA
STA @0751 ; parte alta de retorno de subrtna
PLA
STA @0753 ;PALA+1
PLA
STA @0752 ;PALA
PLA
STA @0755 ;PALB+1
PLA
STA @0754 ;PALB
PLA
STA @0756 ; cantidad de numeros a operar ( CNT1 < 5 numeros )
UNIDADSUM CLA
CLC
; Carga las palabras baja y alta y las corre a la izquierda 2 campos
LDA (@0754) ;Acomoda la palabra baja del numero
ADD @0757
PHA
CLC ;Saca el acarreo de la suma BCD a C para usar los saltos
ROL
CLC
ROL
BCC SUB9U ; Si aparece un acarreo el numero es >9
SUM6U PLA
ADD #@06 ;Le sumo 6 para corregir la palabra
CLC
ROL
CLC
ROL
CLC
ROR
ROR
STA @0757 ;Guarde en PALBT
LDA @0760
INA
STA @0760
CLC
JMP DECENASUM
SUB9U SUB #@20 ;Reste 12 al resultado,uso 010000 porque la palabra aun esta
BCC ALMACENE ;en ese estado dentro del acumulador
JMP SUM6U
ALMACENE PLA ;Pongo los dos bits mas significativos en cero y almaceno el
CLC ;resultado de la suma.
ROR
CLC
ROR
STA @0757
DECENASUM CLA
CLC
LDA (@0752)
ADD @0760
PHA
CLC
ROL
CLC
ROL
BCC SUB9D
SUM6D PLA
ADD #@06
CLC
ROL
CLC
ROL
CLC
ROR
ROR
STA @0760
LDA @0761
INA
STA @0761
CLC
JMP STOK
SUB9D SUB #@20
BCC GUARDE
JMP SUM6D
GUARDE PLA
CLC
ROR
CLC
ROR
STA @0760
Subrutina 2:
* = @0720
CNT2 WRD @00
PALBA DBWRD @4001 ;palabra baja del numero A
PALMA DBWRD @4002 ;palabra media del numero A
PALAA DBWRD @4003 ;palabra alta del numero A
INID2 = @4000
*=@0000
*=@1150
SUB2 PLA ;..organizacion de direcciones
STA @0730 ; parte baja de ret. sub.
PLA
STA @0731 ; parte alta de ret. sub.
PLA
;Organizacion de numero de entrada a subrutina
STA @0733 ;PALAA+1
PLA
STA @0732 ;PALAA
PLA
STA @0735 ;PALMA+1
PLA
STA @0734 ;PALMA
PLA
STA @0737 ; PALBA+1
PLA
STA @0736 ; PALBA
CLA
STA @0740 ;PALAT palabra alta temporal
STA @0741 ;PALMT palabra media temporal
STA @0742 ;PALBT palabra baja temporal
STA @0743 ;CRY acarreo temporal total
;................ Fin de organizacion
PLA
STA @0744 ;cantidad de numeros a tratar CNT2
;......... Inicio de suma
;Suma de las palabras bajas
SUMAB CLC
LDA @0742 ; carga la palabra baja de resultado temporal (PALBT)
ADD (@0736) ; Suma palabra baja del numero (PALBA)
STA @0742 ;guarde en palabra baja de resultado temporal
BCC SUMAM; si C=0 pase a sumar palabra media
LDA @0741; sume C a la palabra media del resultado temporal (PALMT)
INA
STA @0741
;Suma de las palabras medias
SUMAM LDA @0741 ;cargue PALMT
ADD (@0734);Suma palabra media del numero a PALMT
STA @0741
BCC SUMAA; si C=0 pase a sumar palabra alta
LDA @0740; sume C a la palabra alta del resultado temporal (PALAT)
INA
STA @0740
SUMAA LDA @0740 ;cargue PALAT
ADD (@0732);Suma palabra alta del numero a PALAT
STA @0740
BCC VERF; si C=0 verifique cuantos numeros quedan
LDA @0743 ; si se genero un acarreo este se almacena en CRY
INA
STA @0743
;Verifica cuantos numeros quedan por tratar
VERF LDA @0744
DCA
STA @0744
BNE INCRT ; si no es el ultimo numero Incremente punteros de palabra
JMP RET
*=@0000
*=@1000
SUB3 PLA ;..organizacion de direcciones
STA @0710 ; parte baja de ret. sub.
PLA
STA @0711 ; parte alta de ret. sub.
PLA
STA @0713 ;PALA+1
PLA
STA @0712 ;PALA
PLA
STA @0715 ;PALB+1
PLA
STA @0714 ;PALB
PLA
STA @0716 ; Numeros de doble prec. a complementar