Me encotré con el siguiente problema tratando de resolver un TP para la facultad.
A veces, es necesario generar números cuando estamos programando un microprocesador para luego usarlos. Por ejemplo, un cero para comenzar con un contador, o un uno (1) para incrementar ese contador. Otras posibilidades son un dos (2) para incrementar de pares o impares; o incluso un 'menos uno' (-1) para decrementar.
Creo que resulta difícil encontrar este tipo de ayudas en internet, a menos que se realize una búsqueda muy cuidadosa y minusciosa. Yo no lo logré, y es por eso que decidí compartir la información que encotré.
Si bien yo estoy cargando los números con la notación de la BLUE ( utiliza octal y mnemónicos diferentes de otros micros) es muy adaptable a cualquier otro dispositivo. Solo hay que entender la lógica que de lo que se trata de hacer.
Generación del número 'cero':
Éste es el más fácil de comprender. Lo único que hay que hacer es cargar en el acumulador (u otro registro) el contenido de cualquier direccón de memoria. Hecho ésto, se realiza una XOR (or exclusiva) entre el contenido del acumulador (o el registro recién cargado) y el contenido de la misma posición de memoria que utilizamos para cargar el registro. ¿Por qué hacemos una XOR entre el mismo dato? Porque de esta manera, siempre se genera un 'cero'; ya que cualquier número cometido a una XOR consigo mismo, da siempre por resultado un cero. Luego, guardamos el cero (que ahora está en el acumulador) en alguna posicón de memoria que querramos. Ejemplo:
0100 LDA 0555
0101 XOR 0555
0102 STA 0500
No importa que dato esté almacenado en 0555, ya que al hacer una XOR consigo mismo, el resultado será 'cero' y será guardado en la posición 0500.
Generaciónde un número 'uno':
Para éste, podemos basarnos en el 'cero' obtenido anteriormente. Una vez generado el cero, en vez de guardarlo, lo invertimos, es decir, le aplicamos la instrucción NOT. Dicho y hecho, almacenamos este "cero invertido" en alguna dirección (preferemtemente donde vayamos a almacenar el 'uno'). Una vez guardado, hacemos la suma de este "cero invertido" consigo misma; para finalmente invertir el resultado de esa suma. Como se puede imaginar, el resultado es un 'uno'. el proceso algebraico sería el siguiente, ej:
Si comenzamos con 0000, al invertir tenemos 1111.
Al sumar 1111+1111 = 11110.
Si descartamos el bit de acarreo, el resultado es, en realidad: 1110.
Finalmente lo invertimos: 1110 -> queda en -> 0001.
Ej: (suponemos que en 0500 tenemos el cero generado anteriormente)
LDA 0500
NOT 0000
STA 0501
ADD 0501
NOT 0000
STA 0501
y nos queda un hermoso 'uno' en la posición apuntada por 0501.
Generación del número 'dos':
Suponiendo que nos ha quedado un número 2 en la posición 0501 debido al proceso del ítem anterior, la generación de un 'dos' puede realizarse de dos maneras:
Forma primera: Muy obvia, hacemos 1+1 y obtenemos dos. ;) En ensablador sería:
0100 LDA 0501 (aquí teníamos un uno)
0101 ADD 0501 (le sumamos uno)
0102 STA 0502 (almacenamos el dos en la posicicón 0502).
Forma Segunda: No tan intuitiva, pero muy sencilla. Utilizamos la instrucción RAL, que rota cada bit del acumulador una posición a la izquierda de manera cíclica. Si lo utilizamos con un 'uno', nos queda un 'dos'. Admirad:
0001 (1 en binario)
0010 (2 en binario!)
0100 (4 en binario!) y si seguimos así, es como multiplicar por dos el número anterior.
EXTRA: De hecho, cualuier número que tengamos en binario, sin importar cual sea éste, al rotar todos sus bits un lugar a la izquierda, queda multiplicado por dos.
En ensablador: si en 0501 tenemos un 'uno':
0100 LDA 0501
0101 RAL 0000
0102 STA 0502 (almacenamos en 0502 el 'dos' obtenido).
Generación del número '-1':
Éste número lo "fabricamos" a partir de obviamente, el número 'uno'. Supongamos que lo tenemos guardado en la dirección 0501. Cargamos ese 'uno' en el acumulador, posteriormente lo invertimos, finalmente le aplicamos una adición del número 'uno' (contenido en 0501) o bien -y es lo mismo- un OR con el número 'uno'. Lo que sucede es esto:
Comenzamos con: 0001, que luego de invertirlo queda en 1110.
Sumamos a esta inversión el número 0001 (o le aplicamos la OR con este número) de forma que:
1110 + 0001 = 1111 , o mediane una OR que es lo mismo para este caso:
1110 OR 0001 = 1111. Este nuevo número, es el uno negavito.
Ensamblando:
0100 LDA 0501
0101 NOT 0000
0102 ADD 0501 (puede ser IOR 0501)
0103 STA 0503 (aquí queda guardado el '-1').
Eso es todo.
Blog about Software Architecture, Patterns, Practices, Principles and a lot of software issues that I find interesting. Blog sobre Arquitectura de Software, Patrones de Diseño, Principios y otros asuntos de software que me interesan.
Buscar en este blog....
Suscribirse a:
Enviar comentarios (Atom)
Me parece que estamos cursando arquitectura de la computadora en la misma facu jejeje Saludos! Ya agregué tu blog al directorio.
ResponderEliminar