You are on page 1of 36

Sistemas Digitales Avanzados y Microprocesadores: prcticas de simulacin del a o microprocesador Motorola MC68000*

Miguel Moro Vallina**

Preliminares
El modo como estn planteadas las prcticas se presta, en nuestra opia a nin, a emplear la metodolog de la programacin estructurada;1 aun cuando o a o el cdigo ensamblador sea intr o nsecamente no-estructurado, hemos tratado de mantenernos eles a dicha metodolog Primero, considerando los algoritmos y a. subrutinas en primera instancia como cajas negras en las que, antes que los detalles operacionales, interesa denir rigurosamente los argumentos de entrada y salida y las pre y post-condiciones. Y segundo, codicando en pseudolenguaje2 los algoritmos empleados, utilizando para ellos las estructuras iterativas propias de la programacin estructurada y relegando a la fase nal de codicao cin en ensamblador la traduccin de dichas estructuras iterativas por los saltos o o condicionales correspondientes. No obstante, como estadio intermedio entre el pseudolenguaje y el cdigo ensamblador habida cuenta de las diferencias entre o ambos niveles de programacin, no slo en cuanto a las estructuras iteratio o vas sino tambin en los modos de direccionamiento o la forma de evaluar las e expresiones aritmticas, nos ha parecido de utilidad realizar una descripcin e o
* Esta memoria corresponde a las prcticas obligatorias de simulacin del ensamblaa o dor del MC68000 de la asignatura de Sistemas Digitales Avanzados y Microprocesadores, asignatura del Plan 2001 carrera de Ingenier Industrial de la Universidad Naa cional de Educacin a Distancia. This work is licensed under the Creative Commons o Attribution-NonCommercial-ShareAlike 2.5 Spain License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/es/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. La composicin o A de este documento se ha realizado mediante L TEX. ** Correo: narodnaia@gmail.com. Web: http://narodnaia.googlepages.com 1 Vase, por ejemplo, J. Castro, F. Cucker, X. Messeguer, A. Rubio, Ll. Solano y B. e Valles (1993): Curso de programacin. Madrid: McGrawHill. o 2 En realidad, emplearemos el lenguaje WEB como pseudolenguaje particular, puesto que proporciona, a nuestro juicio, un modo claro y riguroso de denir los algoritmos con un cierto nivel de abstraccin. WEB es un sistema de documentacin estructurada creado por Donald o o E. Knuth (vanse ejemplos prcticos en TEX: The Program y en METAFONT: The Program, e a volmenes B y D de Computers and Typesetting, op.cit.). WEB se asemenja bastante al lenguaje u Pascal lo que lo hace ideal para ser fcimlmente comprensible por las personas, con una a serie de combios simblicos que faciiltan su lectura y, especialmente, con una organizacin o o de las diversas partes que componen el programa minuciosamente orientada a facilitar su comprensin. o

por pasos pormenorizada de cada algoritmo propuesto. Dichos pasos se reejan posteriormente como comentarios al cdigo ensamblador, lo cual facilita la o lectura y eventual mantenimiento del programa. Un programa de computadora, por complejo que sea, puede denirse, parafraseando a Donald Knuth, como una suerte de tela de araa compuesta n de elementos simples; para comprender adecuadamente un programa es preciso comprender bien la naturaleza y caracter sticas de dichos elementos y, ms a n, a u las relaciones que los ligan unos a otros.3 En ese contexto, una documentacin o adecuada, completa y precisa, que describa adecuadamente las estructuras de datos y los algoritmos empleados, deviene un elemento clave para construir programas ecientes e imprescindible de cada al mantenimiento, modicaciones y mejoras introducidas en los mismos. Ms a n en un contexto en el que la proa u duccin de software se ha convertido en una tarea cada vez ms colectiva y, o a por decir as taylorizada en la que, a medida que la construccin de progra, o mas de creciente complejidad se disgrega en sus elementos simples, cobran una importancia estratgica las pautas y normas de comunicacin e intercambio de e o informacin entre los diversos programadores, quienes, por a adidura, producen o n elementos cada vez ms sometidos a estndares rigurosos.4 a a En ese contexto, y aun teniendo presente que los problemas propuestos en estas prcticas son peque os y relativamente sencillos, nos hemos esforzado para a n tratar de que la documentacin de los programas elaborados sea los ma clara y o y exhaustiva posible, tratando de presentar la descripcin textual, el ujograma, o la codicacin en pseudolenguaje y la descripcin por pasos de los algoritmos o o propuestos, como elementos complementarios y que, en cierto modo, forman una secuencia de precisin creciente que permite transitar de los problemas a los o programas.5 Pero, para preparar una documentacin legible y bien estructurada, no es o una cuestin balad el disponer de una herramienta adecuada con la que elao borarla. En ese sentido, se ha optado por emplear el sistema de composicin o A tipogrca L TEXque provee, a nuestro modo de ver, la forma ms potente y a a con mejores resultados para componer textos de ndole cient co-tcnica.6 Los e ujogramas se han compuesto en PostScript con la ayuda del paquete PSTricks.7
3 Donald E. Knuth: Literate Programming, en The Computer Journal, vol. 27/2, pp. 97111. 4 Es muy ilustrativo al respecto releer alguno de los textos clasivos de Taylor a la luz de la organizacin productiva de la industria del software actual. Vase, por ejemplo, F.W. Taylor o e (1903): Shop Management. Edicin facs o mil. Londres, 1993: Routlegde. 5 Vase A. Aho, J. Hopcroft y J. Ullman (1983): Estructuras de datos y algoritmos. e Mxico, 1988: AddisonWesley Iberoamericana. e 6 Puede consultarse al respecto la monumental obra de D.E. Knuth: Computers and Typesetting, vols. AE. Reading, Massachussetts: AddisonWesley, as como la obra de B. Cas A cales Salinas et. al.: L TEX: una imprenta en sus manos. Madrid: Aula Documental de Investigacin. o 7 Puede consultarse al respecto M. Goossens, F. Mittelbach, S. Rahtz, D. Roegel A y H. Voss (1998): The L TEX Graphics Companion: Illustrating documents with TEX and PostScript. Reagind, Massachussetts: AddisonWesley.

Prctica I a
Enunciado de la prctica a
Se desea dise ar una subrutina que invierta el orden de un vector de datos n en memoria. Cada componente del vector ocupa un byte. El vector invertido debe quedar almacenado en las mismas posiciones de memoria que el original. Por ejemplo, dado el vector de componentes [0A 0B 0C 0D 0E] (expresado en hexadecimal), el resultado de la subrutina deber ser [0E 0D 0C 0B 0A]. La a subrutina se denominar INVERTIR y recibir la direccin de comienzo en el a a o registro A0 y el tama o del mismo en el registro D0. n

Argumentos de entrada y salida


La subrutina INVERTIR tendr como argumentos de entrada el vector inicial a y su tama o (n mero de elementos de un byte cada uno). El argumento de n u salida ser el vector invertido. Los vectores original e invertido se componen de a un n mero indeterminado de elementos de un byte cada uno, tal como viene u expuesto en el enunciado. Acotaremos el tama o del vector reservando para su n tama o 16 bits de memoria (una palabra), longitud que nos permitir operar n a con vectores de hasta 65536 elementos.

Descripcin textual del algoritmo o


El algoritmo propuesto realizar una suerte de rotacin lgica hacia la dea o o recha del vector inicial, desplazando hacia posiciones crecientes de memoria los elementos del vector. El dato que se desborda por la derecha se almacenar en a la primera posicin por la izquierda. A continuacin se realizar la misma opeo o a racin, pero desplazando slo los datos situados a partir de dicha posicin, y o o o almacenando el dato desbordado en la segunda posicin por la izquierda. El o bucle continuar realizando estos desplazamientos hasta que el elemento (a0 ) a inicialmente situado en la posicin inicial se encuentre en la ultima. o

Descripcin pormemorizada del algoritmo y datos intermedios o empleados


Como puede comprobarse, el algoritmo se compondr de n iteraciones, tana tas como elementos tenga el vector. Deber existir una variable llammosla, a e por ejemplo, CONTADOR que indique el n mero de iteracin en curso y que se u o incremente en cada una de ellas; la variable CONTADOR indicar adems el punto a a en el cual deben introducirse los datos que se desborden por la derecha. Cada una de estas iteraciones, a su vez, estar compuesta por los pasos siguientes: a

1. Almacenar el dato situado ms a la derecha en una variable que denomia naremos AUX. 2. Mover todos los elementos del vector situados en la izquierda de la posicin o indicada por la variable CONTADOR en una posicin, situando el dato de la o posicin n 2 en la n 1, el de la n 3 en la n 2, y as sucesivamente, o hasta la posicin indicada por CONTADOR. Para ello ser preciso realizar o a otro bucle que deber hacer uso de una variable adicional denominada, a verbigracia, CONTADOR BUCLE. 3. Introducir el dato de la variable AUX en la posicin de memoria indicada o por la variable CONTADOR.

Codicacin en WEB o
A partir de la descripcin pormenorizada del algoritmo, codicamos la o subrutina INVERTIR como procedimiento. Supondremos que sus argumentos (que denominaremos vector y tamao) se le pasan al procedimiento como variables n globales.
procedure invertir; var aux: byte; contador: integer; begin contador 0; repeat begin aux vector [tamao]; n for contador bucle 0to contador do begin vector [tamao contador bucle] vector[tamao contador bucle 1]; n n contador bucle contador bucle + 1; end; vector [contador ] aux ; contador contador + 1; until contador = tamao; n end;

Descripcin por pasos del algoritmo o


Una vez efectuada la codicacin del algoritmo en pseudolenguaje, realio zaremos ahora una traduccin del mismo a una cdigo ms cercano al lenguaje o o a ensamblador. La descripcin por pasos, en efecto, es ya mucho ms prxima a o a o la programacin del MC6800, en varios sentidos: en primer lugar, sustituye las o estructuras iterativas por saltos condicionales; en segundo lugar, realiza un uso intensivo de los registros (de datos y de memoria) en lugar de hacer referencia a variables y tipos de datos abstractos; por ultimo, implementa, para cada estruc tura de datos utilizada, los modos de direccionamiento que se consideran ms a adecuados para su realizacin. o Los pasos del algoritmo propuesto ser an, en denitiva, los siguientes. Se supone, tal como viene recogido en el enunciado, que la direccin inicial del o

vector est almacenada en A0 y su tama o en D0.8 a n Paso 1 2 Descripcin o Inicializar CONTADOR. Restar una unidad a la variable TAMA~O, para N poder operar adecuadamente con el modo de direccionamiento elegido. Hacer que A1 apunte al nal del vector de datos en memoria. Emplearemos direccionamiento directo en registro de direcciones. Mover el contenido de la ultima posicin del o vector a la variable AUX. Para ello elmplearemos direccionamiento indirecto a registro. Inicializar CONTADOR 2. Hacer que A1 apunte a la posicin de V1 o TAMA~O CONTADOR 2. N Mover el elemento apuntado una posicin a la o derecha. Emplearemos direccionamiento indirecto a registro con post-autoincremento. Incrementar CONTADOR 2. ~ Si CONTADOR 2 TAMANO CONTADOR, saltar al paso 6. Hacer que A1 apunte a V(CONTADOR). Mover AUX a V(CONTADOR). Emplearemos nuevamente direccionamiento indirecto a registro. Incrementar CONTADOR. Si CONTADOR TAMA~O 1, saltar al paso 3. N Ya se han realizado (TAMA~O 1) iteraciones y N el vector se ha invertido: n del programa. Pseudocd. o D1 0 D0 D0 1

A1 A1 + D0

AUX (A1)

5 6 7

D4 1 A1 A0 + D0 D4 D5 (A1)+; (A1) D5 D4 D4 1 To 6 if D4 D2 A1 A0 + D1 (A1) D3 D1 D1 + 1 To 3 if D1 D2 END

8 9 10 11 12 13 14

El ujograma de la rutina INVERTIR se muestra en la gura 1.

Codicacin en ensamblador o
Se ha codicado un programa en ensamblador que, tal como viene expresado en el enunciado: 1. Dispone de una zona de datos en memoria para almacenar el vector, zona que se inicializa con los valores del ejemplo del enunciado ([0A 0B 0C 0D
8 En la presentacin de la descripcin por pasos y en la forma del pseudocdigo correso o o pondiente a cada uno de ellos, hemos tomado algunos elementos de la descripcin del juego o de instrucciones MIX, creado por Donald Knuth para un hipottico computador de 32 bits. e Vase The Art of Computer Programming, Vol 1 (Fundamental Algorithms). Tercera edicin. e o Reading, Massachussetts, 1997: AddisonWesley.

Inicio D1 0 D0 D0 1 A1 A1 + D0 AUX (A1) D4 1 A1 A0 + D0 D4 D5 (A1)+ A1 D5 D4 D4 + 1 S

D4 D2 D1? No A1 A0 + D1 D3 (A1) D1 D1 + 1 S

D1 < D2? No Fin

Figura 1: Diagrama de ujo de la subrutina INVERTIR.

0E]); dicha zona de memoria se etiqueta como VECTOR, y se ubica detrs a del cdigo del programa. o 2. Carga la etiqueta VECTOR en el registro D0 y el valor 5 en D0. 3. Efect a una llamada a la subrutina y seguidamente una vez que el vector u ubicado en la posicin de memoria apuntada por A1 se halla totalmente o invertido termina. El cdigo en ensamblador propuesto se lista a continuacin: o o
*----------------------------------------------------------* Program :Programa invertir * Written by :Miguel Moro Vallina * Date :23 de agosto de 2007 * Description:Dispone los datos adecuados y llama a la * subrutina INVERTIR *----------------------------------------------------------START ORG $1000 MOVEA.W #VECTOR,A0 MOVEQ #5,D0 BSR INVERT STOP #$2000 *----------------------------------------------------------* Zona de datos *----------------------------------------------------------DATOS ORG $2000 VECTOR DS.B 5 ORG $2000 DC.B $0A,$0B,$0C,$0D,$0E *----------------------------------------------------------* Zona de subrutinas *----------------------------------------------------------SUBS ORG $3000 INVERT MOVE.W #0,D1 Inicializa CONTADOR MOVE.W #0,D1 Paso 1. Inicializa CONTADOR SUBI #1,D0 Paso 2. BUCLE MOVE.W A0,A1 Paso 3. A1 apunta ADDA.W D0,A1 al final del vector * Paso 4. MOVE.B (A1),D3 D3 contiene la variable AUX * Paso 5. MOVEQ #1,D4 Inicializa CONTADOR_BUCLE2 BUCLE2 MOVE.W A0,A1 Paso 6. A1 apunta ADDA.W D0,A1 a V(TAM-CONT_BUCLE2) SUBA.W D4,A1 MOVE.W D0,D2 Copia la long. del vector en D2 MOVE.B (A1)+,D5 Paso 7. MOVE.B D5,(A1) Mueve un elemento a la derecha * Paso 8. ADDI #1,D4 Incrementa CONTADOR_BUCLE2 * Paso 9. SUB.W D1,D2 Calcula TAM-CONTADOR CMP.W D4,D2 Si D4 menor o igual que D2 BGE BUCLE2 repite BUCLE2 (Paso 6) MOVE.W A0,A1 Paso 10. ADDA.W D1,A1 A1 apunta a V(CONTADOR) MOVE.B D3,(A1) Paso 11.

* ADDI MOVE.W CMP.W BGT RTS * #1,D1 D0,D2 D1,D2 BUCLE

Mueve AUX a V(CONTADOR) Paso 12. Incrementa CONTADOR Paso 13. Si D1 menor que D2 repite BUCLE Paso 14. Retorno al programa principal

MOVE.B TRAP END

#9,D0 #15 START

Fin del programa Halt Simulator

Traza de ejecucin o
o En el chero programa invertir reg.txt se muestra la traza de ejecucin del anterior programa, generado con el simulador del Easy68K. La traza incluye el contenido de todos los registros de datos y memoria, as como el del puntero de pila, registros de estado y contador de programa, y de las posiciones de memoria involucradas (concretamente, las direcciones $2000 a $2005, aquellas en las que est almacenado el vector que debe invertirse. La gura 2 muestra la captura a de pantalla de la ventana de conguracin de la traza de ejecucin. o o

Simulacin con [DD CC BB AA] o


Se efect a ahora una nueva simulacin con la subrutina, esta vez con el u o vector [DD CC BB AA]. En este caso, introducimos directamente en memoria el vector pedido ayudndonos de las rdenes disponibles en el simulador; en a o el registro A0 introducimos la posicin de memoria en la que se ubica el vector o ($2000) y en el D0 su tama o (4). La traza de la nueva simulacin efectuada n o con estos datos se lista en el chero invertir reg.txt.

Prctica II a
Enunciado de la prctica a
Disnese una subrutina para la conversin de formato binario a decimal e o de n meros sin signo de 16 bits. La subrutina recibir el nmero binario en u a u la palabra menossignicativa del registro D0 y deber generar una cadena de a cdigos ASCII (en decimal) en memoria de nombre CADNUM, correspondiente a o la secuencia de cifras decimales que representa el n mero pedido.9 Los sucesivos u caracteres de la representacin en ASCII se almacenarn en memoria de forma o a
ejemplo, si se recibe el nmero 3F7B en hexadecimal (= 16251 en decimal), la cadena u CADNUM que se ha de generar es [49,55,54,50,49,0], habida cuenta de que el cdigo ASCII o de cada cifra decimal se obtiene sin ms que incrementarla en 48 unidades. a
9 Por

Figura 2: Captura de pantalla de la conguracin de la traza de ejecucin. o o

10

consecutiva y ordenada de mayor a menor peso. Detrs del ultimo carcter de a a la cadena se a adir un carcter nulo. n a a

Descripcin textual del algoritmo o


El algoritmo efectuar la divisin entera entre 10 del nmero recibido. El a o u resto (cifra de menor peso del n mero decimal correspondiente) se almacenar en u a memoria. El cociente obtenido se volver a dividir entre 10, almacenndose el a a nuevo resto en la posicin de memoria inmediatamente superior y as sucesio vamente, hasta que el cociente obtenido sea nulo. El vector de datos situado en la memoria en cuyo inicio se habr situado un carcter nulo se inera a tir a continuacin (invocando a la subrutina INVERTIR de la prctica anterior), a o a obteniendo de este modo el resultado pedido.

Descripcin pormenorizada del algoritmo y constantes y variao bles empleadas


La primera operacin que deber efectuar la subrutina es situar en memoo a ria (en la zona etiquetada como CADNUM) un carcter nulo. Realizado lo cual, el a algoritmo consistir bsicamente en un bucle que realizar las siguientes operaa a a ciones: 1. Tomar el dato inicial (llamaremos DIVIDENDO a la variable en la que se encuentra) y realizar su divisin entre 10, almacenando el resto en la variable o MODULO y el resultado en COCIENTE. A la variable mdulo se le sumar el o a n mero 48 y se almacenar el resultado en la posicin consecutiva del u a o vector CADNUM. 2. Comprobar si COCIENTE es igual a cero y, en caso contrario, cargar su contenido en DIVIDENDO y repetir la operacin. o 3. En el caso de que COCIENTE sea nulo, el bucle nalizar y se llamar a la a a subrutina INVERTIR para que invierta el vector situado e la posicin de o memoria CADNUM y lo ordene, tal como pide el enunciado, con los d gitos de menor peso en posiciones crecientes de memoria. Deberemos adems disponer de una variable TAM que cuente, a medida que se a van cargando datos en el vector CADNUM, el tamao de dicho vector. La variable n TAM tendr una utilidad doble: por una parte, indicar en qu posicin de mea a e o moria se debe introducir el dato siguiente; por otra, una vez nalizado el bucle, se pasar como argumento de la subrutina INVERTIR. a Veamos, por ultimo, los tamaos de los datos de entrada y salida. Para n el vector de cdigos ASCII es suciente, como es obvio, reservar un byte por o elemento; adems, ello debe ser as por coherencia con el tama o de los datos a , n de entrada de la subrutina INVERTIR. Por la misma razn, para la variable TAM o reservaremos una palabra de memoria, si bien dicho tama o que permitir n a

11

operar con un n mero de hasta 65536 cifras excede con creces las longitudes u que habrn de tener los datos y la propia capacidad de clculo de la unidad a a aritmtico-lgica del microprocesador. e o En el juego de instrucciones de la familia Motorola 68000 existen dos instrucciones que efect an la divisin entera de n meros codicados en binario: u o u DIVS y DIVU, empleadas respectivamente para operar con n meros con signo u (signed ) o sin l (unsigned ). Ambas efect an la divisin de un dato de 32 bits e u o (en destino) entre otro de 16 bits (en fuente), generando dos resultados de 16 bits: el cociente y el resto. El cociente se guarda en los 16 bits menos signicativos y el resto en los 16 bits ms signicativos del registro destino. a

Codicacin en WEB o
De la descripcin del algoritmo surje fcilmente su codicacin en WEB. o a o Asumiremos, como hicimos en la anterior prctica, que el argumento de dicho a procedimiento (numero binario) se pasar como variable global. Por coherencia a con el criterio de la prctica anterior, en la llamada al procedimiento invertir, el a paso de los argumentos se har mediante las variables globales tamao y vector. a n
procedure convertir; var dividendo, cociente, resto, tam: integer; begin tam 0; tam tam + 1; dividendo numero binario; repeat begin cociente dividendo div 10; resto dividendo mod 10; r r + 48; cadnum[tam] r; tam tam + 1 until dividendo = 0; tamao tam; n vector cadnum; invertir ; end;

Descripcin por pasos del algoritmo propuesto o


Los pasos del algoritmo que se propone para resolver el problema planteado ser los siguientes. Suponemos, tal como viene propuesto en el enunciado, que an el vector de cdigos ASCII generado (que vendr expresado en base hexadecimal) o a se sit a en la zona de memoria etiquetada como CADNUM10 y que el argumento de u
10 Puesto que el n mero decimal de partida ocupa una palabra de memoria, habremos de u operar con nmeros de cinco cifras a lo sumo. Teniendo en cuenta que en el vector de cdigos u o ASCII deberemos situar un cero en la ultima posicin, reservaremos para CADNUM seis octetos o de memoria.

12

entrada al algoritmo (el n mero con cuyas cifras decimales se debe componer el u vector ASCII, NUM BIN) se introducir como una constante en la zona de datos a del programa, representndolo, por comodidad, en base hexadecimal. a Paso 1 Descripcin o Inicializar la variable TAM, que contar los a elementos del vector ASCII, dato necesario para invocar posteriormente a la subrutina INVERTIR. Hacer que A0 apunte a la zona de memoria etiquetada como CADNUM. Situar un 0 en la posicin inicial del veco tor CADNUM e incrementar la posicin a la que o apunta A0 en una unidad. Emplearemos direccionamiento indirecto a registro con postautoincremento. Cargar el dato de entrada NUM BIN en D1. Efectuar la divisin entera de D1 entre 10; el o cociente se almacenar en la palabra menos a signicativa de D1 y el resto en la palabra ms a signicativa. Intercambiar las dos palabras de D1 para poder operar con el resto de la operacin anterior. o Situar en la zona de memoria apuntada por A1 el n mero r + 48. Para ello emplearemos u direccionamiento indirecto a registro con postautoincremento. Incrementar la variable TAM. Poner a cero los 16 bits menos signicativos de D1, para evitar resultados espurios en la siguiente divisin. o Intercambiar las palabras de D1 para situar el cociente en la palabra menos signicativa. Si COCIENTE = 0, saltar al paso 5 Situar en el registro A0 la direccin de CADNUM, o argumento de la subrutina INVERTIR. Incrementar la variable TAM. Invocar a la subrutina INVERTIR. Fin del programa. Pseudocd. o D0 0

2 3

A0 #CADNUM (A0)+ 0

4 5

D1 #NUMBIN D1 D1 mod 10

6 7

SWAP D1 (A1)+ D1 + 48

8 9

D0 D0 + 1 D1 0W

10 11 12 13 14 15

SWAP D1 To 5 if D1 = 0 A0 #CADNUM D0 D0 + 1 To INVERT END

El ujograma del programa CONVERTIR se muestra en la gura 3

13

Inicio D0 0 A0 #CADNUM (A0)+ 0 D1 #NUM BIN D1 D1 mod 10 SWAP D1 (A1)+ D1 + 48 D0 D0 + 1 D1 0W SWAP D1 S

D1 = 0? No D0 D0 + 1 To INVERT Fin

Figura 3: Diagrama de ujo del programa CONVERTIR.

14

Codicacin en ensamblador o
Se ha codicado en el ensamblador del MC68000 la subrutina pedida. El cdigo propuesto se lista a continuacin: o o
*----------------------------------------------------------* Program :CONVERTIR * Written by :Miguel Moro Vallina * Date :18 de agosto de 2007 * Description:Convierte binario a vector de cdigos ASCII o * que representan los dgitos de cada nmero en decimal u * El vector se situar en la direccin indicada por a o * CADNUM *----------------------------------------------------------CONVERT ORG $1000 MOVEQ #0,D0 Paso 1. Inicializa TAM MOVEA.W #CADNUM,A0 Paso 2. MOVE.B #0,(A0)+ Paso 3. Sita un 0 en CADNUM e u * incrementa el puntero en una * posicin o MOVE.W #NUM_BIN,D1 Paso 4. BUCLE DIVU #10,D1 Paso 5. SWAP D1 Paso 6. Intercambia las mitades * de D1 ADDI #48,D1 Paso 7. Suma r+48 MOVE.B D1,(A0)+ Mueve el cdigo a la posicin o o * correspondiente del vector * y postautoincrementa la pos. ADDI #1,D0 Paso 8. Incrementa TAM MOVE.W #0,D1 Paso 9. Pone a cero los 16 bits * menos significativos de D1 SWAP D1 Paso 10. Sita el cociente en la u * palabra menos significativa CMP.B #0,D1 Paso 11. Si el COCIENTE es distinto BNE BUCLE de cero, comienza de nuevo * el bucle MOVEA.W #CADNUM,A0 Paso 12. ADDI #1,D0 Paso 13. Incrementa TAM BSR INVERT Paso 14. * Paso 15. Fin del programa STOP #$2000 Detiene la ejecucin o

*----------------------------------------------------------* Zona de datos *----------------------------------------------------------DATOS ORG $2000 CADNUM DS.B 6 Se reservan 6 bytes de memoria * para CADNUM ORG $2010 NUM_BIN EQU $3F7B El nmero binario que u * se quiera convertir *----------------------------------------------------------* Zona de subrutinas *----------------------------------------------------------SUBS ORG $3000 INVERT MOVE.W #0,D1 Inicializa CONTADOR MOVE.W #0,D1 Paso 1. Inicializa CONTADOR SUBI #1,D0 Paso 2. BCL_IN MOVE.W A0,A1 Paso 3. A1 apunta

15

ADDA.W * MOVE.B * MOVEQ BCL2_IN MOVE.W ADDA.W SUBA.W MOVE.W MOVE.B MOVE.B * ADDI * SUB.W CMP.W BGE MOVE.W ADDA.W MOVE.B * ADDI MOVE.W CMP.W BGT RTS * MOVE.B TRAP END

D0,A1 (A1),D3 #1,D4 A0,A1 D0,A1 D4,A1 D0,D2 (A1)+,D5 D5,(A1) #1,D4 D1,D2 D4,D2 BCL2_IN A0,A1 D1,A1 D3,(A1) #1,D1 D0,D2 D1,D2 BCL_IN

al final del vector Paso 4. D3 contiene la variable AUX Paso 5. Inicializa CONTADOR_BUCLE2 Paso 6. A1 apunta a V(TAM-CONT_BUCLE2) Copia la long. del vector en D2 Paso 7. Mueve un elemento a la derecha Paso 8. Incrementa CONTADOR_BUCLE2 Paso 9. Calcula TAM-CONTADOR Si D4 menor o igual que D2 repite BUCLE2 (Paso 6) Paso 10. A1 apunta a V(CONTADOR) Paso 11. Mueve AUX a V(CONTADOR) Paso 12. Incrementa CONTADOR Paso 13. Si D1 menor que D2 repite BUCLE Paso 14. Retorno al programa principal Fin del programa Halt Simulator

#9,D0 #15 CONVERT

Traza de ejecucin o
o En el chero convertir reg.txt se muestra una traza de la ejecucin del programa del programa para el n mero 1625110 = 3F7B16 ; en la traza se muesu tra el contenido de los registros de datos y memoria, as como el puntero de pila, registros de estado y contador de programa; tambin se representan las e posiciones de memoria ($2000 a $2006 en las que se situar el vector CADNUM. a

Prctica III a
Enunciado de la prctica a
Primera parte Real cese un programa en el ensamblador del MC68000 que nos diga el d de la semana que fue (lunes a domingo) un d concreto a a facilitado por teclado. En concreto, el programa preguntar en primer lugar a el a o; en segundo lugar, el n mero de mes (1 a 12) y, en tercer lugfar, el n u d Calcularemos y mostraremos el d de la semana de la fecha introducida a. a sabiendo que el 1 de enero de 2007 fue lunes. Las fechas introducidas tienen que ser anteriores a ese valor.

16

Segunda parte Mejorar el programa anterior para que, en vez de preguntarnos el n mero de mes, nos pregunte el nombre del mes (de enero a diciembre). u Para ello deberemos escribir una subrutina que compare dos cadenas de texto, cuyas direcciones sern proporcionadas en A1 y A2. La subrutina devolver 1 en a a D1 si son iguales y 0 en D1 si son diferentes. Tercera parte Mejorar el apartado anterior para comprobar que los tres datos introducidos por teclado son vlidos: para el a o, estar comprendido en a n a el rango [1, . . . , 2006]; el nombre del mes tiene que ser uno de los doce posibles, todo en min sculas; el d del mes tendr que ser vlido para el mes que hemos u a a a introducido (por ejemplo, si el mes introducido es febrero, el d del mes a deber pertenecer al intervalo [1, . . . , 28]). a N.B. Con el objetivo de simplicar la prctica, no se tendrn en cuenta en a a ning n apartado los a os bisiestos, i.e., se supondr que todos los a os tienen u n a n 365 d as.

Primera parte Descripcin textual del algoritmo o


La solucin que se propone consta de dos componentes. El primero de ellos o debe realizar la conversin de la fecha introducida a trminos absolutos, i.e., o e contar el n mero de d que median entre la fecha introducida y el 1 de enero u as de 2007. Seguidamente, el algoritmo deber efectuar una correspondencia ena tre dicho nmero de d y un determinado nombre de d de la semana, i.e., u as a encasillar este n mero en una de siete posibles celdas.11 u El cculo del n mero de d que median entre la fecha introducida y el a u as 1 de enero de 2007 puede determinarse mediante un ejemplo. Supongamos, en efecto, que la fecha introducida es el 25 de julio de 2004. El n mero de d u as ser entonces: a D = 365 (2006 2004) + 31 + 30 + 31 + 30 + 31 + 31 25,
12 11 10 9 8 7

donde los n meros 12, 11, 10 . . . indican el ndice del mes al que corresponden u los n meros de d 31, 30, 31, . . .. El hecho de que a cada mes corresponde un u as m mero diferente de d invita a situar dichas cifras en un vector (llammosu as e lo V1) y acceder a ellas mediante direccionamiento relativo para facilitar los clculos. a Una vez efectuado el clculo del n mero de d efectuaremos con el rea u as, sultado la operacin N = D mod 7, haciendo corresponder a N , resto de la o
11 As si por ejemplo introdujsemos la fecha del 31 de diciembre de 2006, el algoritmo , e deber determinar que entre ambas fechas media 1 d nmero al que deber corresponder a a, u a la palabra domingo, exactamente igual que si mediasen 8, 15, 22, etctera. Es obvio que la e implementacin matemtica de dicha correspondencia es la operacin mdulo. Por cierto que o a o o este mtodo es idntico (salvo por el nmero de celdas o casillas) al modo como en Espaa e e u n se realiza la asignacin de las letras del nmero de identicacin scal a partir de la clave o u o proporcionada por el nmero del Documento Nacional de Identidad. u

17

divisin de N entre 7, un determinado signicante, seg n la siguiente tabla de o u equivalencia: D mod 7 0 1 2 3 4 5 6 Da de la semana lunes domingo sbado a viernes jueves mircoles e martes

La implementacin de esta tabla de equivalencia, trivial en un lenguaje de o alto nivel, requerir en ensamblador la utilizacin de un direccionamiento ina o directo. En memoria estarn almacenados los nombres de los d de la semana a as o, dicho con ms precisin, los cdigos ASCII de los caracteres (en min sculas) a o o u de los que estn compuestos; las cadenas se hallar separadas por un carcter a an a apropiado (por ejemplo, el carcter nulo). Otra tabla situada en memoria cona tendr las direcciones de inicio de cada nombre y, por ultimo, a las celdas de a dicha tabla se acceder mediante un puntero compuesto de su direccin absoa o luta (supongmosla almacenada en el registro A1) ms un n mero de posiciones a a u dado, precisamente, por la operacin D mod 7. o

Descripcin pormenorizada del algoritmo y variables empleadas o


Para la mayor parte de las variables utilizadas en el algoritmo (cdigos ASo CII, n mero del mes, d del mes, etctera) ser suciente contar con un octeto u a e a de memoria, que permitir representar n meros naturales pertenecientes al ina u tervalo [0, 255]. Para representar el a o de la fecha introducida reservaremos n una palabra de memoria asumiremos que se introducen solamente a os posin tivos, correspondientes por tanto a fechas de nuestra era y para la cuenta de d transcurridos entre aquella y el 1 de enero de 2007, una palabra larga, que as permitir albergar un entero positivo comprendido entre 0 y aproximadamente a 4,295 109 , rango ms que suciente habida cuenta de la acotacin antedicha. a o El algoritmo transcurrir bsicamente seg n la siguiente secuencia de paa a u sos:12 1. Leer los n meros de a o, mes y d que se introducirn por teclado y se u n a, a almacenarn, respectivamente, en las variables A~O, MES y DIA. a N 2. Calcular el n mero de d transcurridos entre la fecha introducida y el 1 u as de enero de 2007, cifra que se almacenar en la variable NUM DIAS. Dicho a clculo deber, tal como se ha indicado, leer hacia atrs los datos (n mero a a a u de d de cada mes) del vector V1 desde el correspondiente a diciembre as
que los vectores V1, V2 y V3 que se han denido estn presentes en memoa ria como datos, para lo cual debern, obviamente, introducirse como constantes en la zona a correspondiente del programa.
12 Asumiremos

18

hasta el correspondiente al introducido por teclado (incluyendo ste), para e lo cual habr de implementarse un bucle que deber disponer de una a a variable que cuente los pasos efectuados, variable que denominaremos CONTADOR. Ser necesaria tambin una variable auxiliar para almacenar a e datos parciales; denominaremos AUX a tal variable. 3. Calcular el resto de la divisin entera de NUM DIAS entre 7; el resultado de o dicha operacin se almacenar en la variable N . o a 4. Mediante el direccionamiento indirecto descrito anteriormente, leer en memoria el nombre del d de la semana que corresponda al N calculado y a representarlo en el perifrico de salida. Para ello haremos uso nuevamene te de la variable AUX antes citada, as como de una variable CHAR en la que iremos almacenando los cdigos ASCII de los caracteres del nombre o del d de la semana; la lectura nalizar cuando encontremos el carcter a a a nulo.

Descripcin por pasos del algoritmo o


Los pasos del algoritmo que se propone para resolver el problema planteado se muestran a continuacin.13 o Paso 1 Descripcin o Pseudocd. o Ejecutar la interrupcin de lectura de dato o input A~O D3 N numrico desde teclado para leer la variable e A~O y situarla en D3. Este registro se emN plear tambin para computar el n mero de a e u d transcurridos entre la fecha introducida y as el 1 de enero de 2007. Ejecutar la interrupcin de lectura de dato o input MES D2 numrico desde teclado para leer MES y situar e la variable en D2. Ejecutar la interrupcin de lectura de dato o input DIA D1 numrico desde teclado para leer DIA y situar e la variable en D1. Realizar la operacin 365 (2006 A~O) y al- D3 365(2006D3) o N macenar su resultado en D3. Inicializar la variable CONTADOR, que empleaD5 12 remos para acceder a los datos del vector V1, que contiene el n mero de d de cada mes. u as

4 5

13 Para implementar las operaciones de entrada y salida haremos uso de las excepciones en modo supervisor previstas en el Easy68K, invocadas a travs de la instruccin TRAP. Cone o cretamente, la instruccin TRAP #15 se emplea para intercambiar datos con los perifricos de o e entrada y salida, debindose situar en el registro D0 el cdigo de la tarea que se desea ejecutar. e o Emplearemos las siguientes:

2 4 6

Lee una cadena de caracteres del teclado y la almacena en (A1), devolviendo su longitud (80 caracteres como mximo) en D1.W. a Lee un nmero del teclado y lo almacena en D1.L. u Muestra en pantalla el carcter cuyo cdigo ASCII se halle almacenado en a o D1.B.

19

7 8

9 10 11 12

Hacer que A1 apunte al inicio del vector V1, situado en la zona de memoria etiquetada como DIAS M. Inicializar la variable AUX, en la que se irn a almacenando los elementos le dos de V1. Copiar el dato situado en la posicin de V1 o apuntada por A1 en la variable AUX. Emplearemos direccionamiento indirecto a registro con post-autoincremento. Decrementar la variable CONTADOR. Sumar el contenido de la variable AUX al cmputo total de d almacenado en D3. o as, Si CONTADOR MES, saltar al paso 8. Restar la variable DIA del cmputo total de o d transcurridos. (Tras este paso, el registro as D3 contiene el n mero de d transcurridos u as hasta el 31 de diciembre de 2006 ). Incrementar el n mero de d en una unidad. u as Efectuar la divisin entera del n ymero de d o u as (D3) entre 7 (el cociente se almacenar en la a palabra menos signicativa de D3 y el resto en la palabra ms signicativa). Permutar las dos a palabras de D3. Hacer que A1 apunte al inicio del vector V2 (situado en la zona de memoria etiquetada como DIR D), que contiene las direcciones de inicio de las cadenas ASCII correspondientes a los nombres de los d de la semana. as Posicionar el apuntador de A1 en la celda de V2 que contenga la direccin del d de la seo a mana correspondiente a la anterior operacin o D3 mod 7. Puesto que las direcciones ocupan una palabra de memoria, debe multiplicarse por dos el resultado de dicho clculo para que a la operacin se efect e correctamente. o u Situar en A2 el contenido de la direccin de o memoria apuntada por A1. Se emplea direccionamiento indirecto a registro. Inicio del bucle de escritura. Situar en D1 el carcter apuntado por A2. Se emplea direccioa namiento indirecto con postautoincremento. Si el cdigo le corresponde al carcter nulo o do a (bit de estado Z a 1), saltar al paso 22 para nalizar el programa. En caso contrario, ejecutar la interrupcin de o escritura en pantalla del carcter almacenado a en D1.

A1 #DIAS M

D6 0 D6 (A1)+

D5 D5 1 D3 D3 + D6 To 8 if D5 D2 D3 D3 DIA

13 14

D3 D3 + 1 D3 D3 mod 7

15

A1 #DIR D

16

A1 A1 + 2 D3

17

A2 (A1)

18

D1 (A2)+

19

To 22 if Z = 1

20

output D1

20

21

22

Si el cdigo le no corresponde al carcter o do a nulo (bit de estado Z a 0), saltar al paso 18 para repetir el bucle de escritura. Fin del programa.

To 18 if Z = 0

END

El ujograma del programa CONVERTIR FECHA se muestra en la gura 4.

Codicacin en ensamblador o
Se ha codicado en ensamblador el programa pedido en el enunciado. El cdigo propuesto se lista a continuacin. o o
*----------------------------------------------------------* Program :CONVERTIR_FECHA * Written by :Miguel Moro Vallina * Date :18 de agosto de 2007 * Description:Muestra el da de la semana de una fecha * introducida por teclado *----------------------------------------------------------CONV_F ORG $1000 MOVE.B #4,D0 Paso 1. Ejecuta la interrupcin o TRAP #15 de lectura de dato de teclado * para leer el A~O. N MOVE.W D1,D3 Sita A~O en D3 u N TRAP #15 Paso 2. Lectura de MES MOVE.W D1,D2 Sita MES en D2 u TRAP #15 Paso 3. Lectura de DA I * Queda almacenado en D1 NEG D3 Paso 4. Resta ADDI #2006,D3 2006-A~O N N MULU #365,D3 Multiplica 365*(2006-A~O) MOVEQ #12,D5 Paso 5. Inicializa CONTADOR MOVEA.W #DIAS_M,A1 Paso 6. Sita en A1 la u * direccin de DIAS_M o MOVEQ #0,D6 Paso 7. Inicializa AUX BUCLE MOVE.B (A1)+,D6 Paso 8. SUBI #1,D5 Paso 9. Decrementa CONTADOR ADD.W D6,D3 Paso 10. D3=D3+AUX CMP D5,D2 Paso 11. Si CONTADOR mayor BLE BUCLE que MES, salta a BUCLE SUB.W D1,D3 Paso 12. D3=D3-DIA ADDI #1,D3 Paso 13. DIVU #7,D3 Paso 14. SWAP D3 D3=D3 mod 7 MOVEA.W #DIR_D,A1 Paso 15. A1 apunta a V2[0] MULU #2,D3 Paso 16. ADDA.W D3,A1 A1 apunta a V3[D3] MOVEA.W (A1),A2 Paso 16. A2 apunta a la * direccin de inicio de o * la cadena corresp. BUC_S MOVE.B (A2)+,D1 Paso 18. Bucle de escritura BEQ FIN Paso 19. Si el cdigo ledo o * es $00, salta a FIN MOVE.B #6,D0 Paso 20. Muestra en pantalla el TRAP #15 caracter contenido en D1.B BNE BUC_S Paso 21. Si el cdigo ledo no o * es $00, salta a BUC_S

Inicio ~ Leer ANO D3 Leer MES D2 Leer DIA D1 D3 365 (2006 D3) D5 12 D4 #DIAS M D6 0 D6 (A1)+ D5 D5 1 D3 D3 + D6 S

D5 D2?

D3 D3 DIA No D3 D3 + 1 D3 D3 mod 7 A1 #DIR D A1 A1 + 2 D3 A2 (A1) D1 (A2)+ S

Z = 1? No Escribir D1

Z = 0? S No Fin

Figura 4. Diagrama de ujo del programa CONVERTIR FECHA.

21

FIN DATOS DIAS_M DIAS DIR_D DIR_LU DIR_DO DIR_SA DIR_VI DIR_JU DIR_MI DIR_MA NOM_D LUN

STOP ORG DS.B ORG DC.B ORG DS.W ORG DC.W DC.W DC.W DC.W DC.W DC.W DC.W ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B MOVE.B TRAP END

#$2000

Paso 22. Fin de programa

DOM

SAB

VIE

JUE

MIE

MAR

$3000 12 $3000 31,30,31,30,31,31,30,31,30,31,28,31 $300C 7 $300C $3020 Direccin de la cadena o $3026 Direccin de la cadena o $302E Direccin de la cadena o $3036 Direccin de la cadena o $303E Direccin de la cadena o $3046 Direccin de la cadena o $3050 Direccin de la cadena o $3020 6 $3020 $6C,$75,$6E,$65,$73 0 Final de "lunes" $3026 8 $3026 $64,$6F,$6D,$69,$6E,$67,$6F 0 Final de "domingo" $302E 7 $302E $73,$61,$62,$61,$64,$6F 0 Final de "sbado" a $3036 8 $3036 $76,$69,$65,$72,$6E,$65,$73 0 Final de "viernes" $303E 7 $303E $6A,$75,$65,$76,$65,$73 0 Final de "jueves" $3046 10 $3046 $6D,$69,$65,$72,$63,$6F,$6C,$65,$73 0 Final de "miercoles" $3050 7 $3050 $6D,$61,$72,$74,$65,$73 0 Final de "martes" #9,D0 #15 CONV_F

"lunes" "domingo" "sabado" "viernes" "jueves" "miercoles" "martes"

Halt Simulator

22

Figura 4: Captura de pantalla de la ventana de entrada y salida del simulador.

Simulacin del programa o


Se realiza una simulacin del programa elaborado con el Easy68K. Los dao tos introducidos por teclado y el resultado mostrado en pantalla se muestra en la captura de pantalla de la gura 4. La traza registros de datos y memoria, registro de estado, puntero de pila y contador de programa correspondiente a la ejecucin del algoritmo para dichos datos se muestra en el chero o convertir fecha reg.txt.

Segunda parte Descripcin textual del algoritmo o


a o a a La subrutina COMPARA CADENAS14 realizar la comparacin, carcter a carcter, de dos cadenas de texto situadas en sendas posiciones de memoria, almacenadas en los registros de direcciones A1 y A2. Asumiremos que dichas cadenas contienen un carcter de terminacin (emplearemos nuevamente el carcter a o a nulo) tal que, al llegar a l, la comparacin nalizar. Tan pronto como la e o a comparacin por caracteres encuentra una pareja distinta, el proceso naliza o situando un 0 en D1. En caso contrario, se contin a avanzando hasta llegar a u
14 En esta segunda parte de la prctica, nos limitaremos a implementar la subrutina mena cionada, pero no replantearemos an el programa CONVERTIR FECHA para incluir la mejora u propuesta en el enunciado de la prctica. La incluiremos en la tercera parte de la misma, a junto con las relativas a asegurara la coherencia de los datos introducidos por teclado

23

los caracteres de terminacin de ambas cadenas, en cuyo caso se colocar un 1 o a en el registro D1 indicando con ello que ambas cadenas son idnticas. e

Descripcin pormenorizada del algoritmo y variables empleadas o


Supondremos que las cadenas son sendos vectores que llamaremos V1 y V2 de caracteres o, ms bien, de cdigos ASCII, con lo que reservaremos un a o octeto de memoria para cada uno de ellos. Sus direcciones de inicio, como se ha indicado, se almacenan en los registros de direcciones A1 y A2. Emplearemos dos variables (CHAR1 y CHAR2, ambas de un byte de longitud) en las que cargaremos cada pareja de caracteres a comparar. El bucle avanzar hacia posiciones a crecientes de memoria hasta alcanzar sendos caracteres de terminacin. La como paracin nalizar con resultado positivo, lgicamente, si dichos caracteres se o a o alcanzan a la vez en ambas cadenas.

Descripcin por pasos del algoritmo propuesto o


La subrutina COMPARA CADENAS propuesta se compondr de los pasos sia guientes: Paso 1 Descripcin o Inicio del bucle de comparacin. Cargar en D2 o el contenido de la posicin a la que apunta A1. o Se emplea direccionamiento indirecto a registro con post-autoincremento. Cargar en D3 el contenido de la posicin a o la que apunta A2. Se emplea tambin die reccionamiento indirecto a registro con postautoincremento. Si D2 = D3, saltar al paso 7. En caso contrario, comprobar si D2 = 0 (condicin que indicar el n de la cadena). Si o a D2 = 0, saltar al paso 1 para repetir la comparacin con la siguiente pareja de caracteres. o En caso contrario (D2 = 0), situar un 1 en D1 para indicar que ambas cadenas son iguales. Saltar al paso 8 (n de programa). (Las cadenas son desiguales). Situar un 0 en D1. Fin del programa. Pseudocd. o D2 (A1)+

D3 (A2)+

3 4

To 7 if D2 = D3 To 1 if D2 = $00

5 6 7 8

D1 1 To 8. D1 0 END

El ujograma de la subrutina propuesta se muestra en la gura 5.

24

Inicio D2 (A1)+ D3 (A2)+

D2 = D3? No S D2 = 0? No D1 1 D1 0 Fin

Figura 5. Diagrama de ujo de la subrutina COMPARA CADENAS.

25

Codicacin en ensamblador o
El cdigo elaborado para la subrutina propuesta en el enunciado de la prctio a ca es el que se lista a continuacin: o
*----------------------------------------------------------* Program :COMPARA_CADENAS * Written by :Miguel Moro Vallina * Date :19 de agosto de 2007 * Description:Compara dos cadenas de caracteres *----------------------------------------------------------CMP_CAD ORG $1000 BUC_CMP MOVE.B (A1)+,D2 Paso 1. MOVE.B (A2)+,D3 Paso 2. CMP.B D2,D3 Paso 3. Si D2 no es igual que BNE DESIG D3, salta al paso 7 CMP.B #$00,D2 Paso 4. Si D2 no es igual a BNE BUC_CMP $00 (car. nulo), salta a * paso 1 para repetir bucle. IGUAL MOVE.B #1,D1 Paso 5. Iguales: sita 1 en D1 u BRA FIN Paso 6. Salta al paso 8 (fin * de programa DESIG MOVE.B #0,D1 Paso 7. Desiguales: sita 0 u * en D1 FIN STOP #$2000 Paso 8. Fin del programa MOVE.B TRAP END #9,D0 #15 CMP_CAD

Halt Simulator

Simulaciones de la subrutina
Se realizarn un par de simulaciones de la subrutina elaborada. En la pria mera de ellas se situarn dos cadenas de caracteres iguales (concretamente, la a cadena diciembre) en sendas posiciones de mamoria (las posiciones $0000 y $0010). La captura de pantalla mostrada en la gura 5 muestra la presencia de dichas cadenas en memoria. La traza generada por la subrutina es la mostrada en el chero compara cadenas iguales.txt. Si, por el contrario, hacemos que las cadenas de texto sean desiguales (concretamente, se introducen las cadenas diciembr y diciembre en las posiciones de memoria antes indicadas, tal y como recoge la gura 6), la traza generada por el simulador al ejecutar la subrutina es la listada en el chero compara cadenas desiguales.txt.

Tercera parte Descripcin textual del algoritmo o


El programa, mejorado para asegurar la coherencia de los datos introducidos, es bastante similar al descrito en la primera parte de esta prctica. Su a

26

Figura 5: Memoria del simulador para cadenas iguales.

Figura 6: Memoria del simulador para cadenas desiguales.

27

~ unica diferencia con aquel es que, para cada uno de los datos DIA, MES y ANO introducidas, el algoritmo comprobar que los datos son coherentes, volviendo a a realizar la peticin del dato en caso contrario. En el caso de la variable A~O, o N dicha comparacin es trivial: deber cumplirse que A~O sea mayor que cero y o a N menor que 2007. Para comprobar que el nombre del mes est entre los doce e posibles habremos de emplear nuevamente un modo de direccionamiento indirecto. En efecto, en memoria estarn situados en posiciones consecutivas y a separadas por caracteres nulos, tal como se hizo anteriormente con los nombres de los d de la semana los nombres de los meses del a o, en un vector que as n denominaremos V5. Una tabla de apuntadores, V4, contendr en sus celdas la a direccin de inicio de cada nombre. o El algoritmo que habr de comprobar la coherencia del nombre de mes a consistir en un bucle que obrar del modo siguiente. Un bucle permitir recorrer a a a la tabla de apuntadores antes mencionada. La direccin a la que apunta cada o celda (i.e., la direccin de comienzo de la cadena que contiene el nombre del mes) o se cargar en A2 y, seguidamente, se invocar a la subrutina COMPARA CADENAS a a para que coteje el texto introducido por teclado (situado en una direccin de o memoria apuntada por el registro A1) y la cadena a la que apunta A2. Si el registro D1 contiene un 0, el bucle se ejecutar de nuevo para comprobar si el a texto introducido por teclado coincide con el nombre del mes siguiente. Si, por el contrario, D1 contiene un 1, el bucle nalizar y en MES se almacenar el a a contenido del contador del bucle (n mero del mes cuyo nombre ha coincidido u con la cadena introducida). Si se llega al ultimo mes y ninguno ha coincidido, el programa volver a pedir que se introduzca el dato por teclado. a Restar, por ultimo, comprobar la coherencia del dato DIA. Para ello ema plearemos el vector V1 denido en la primera parte de la prctica, que contiene a en sus celdas el n mero de d de cada mes. Conocido el dato MES, bastar comu as a probar que DIA es menor que cero y menor o igual que el dato almacenado en la posicin MES de V1. En el caso de que la interseccin de ambas condiciones o o sea cierta, el prgrama continuar ya de modo idntico a como se ha descrito en a e la primera poarte. En caso contrario, volver a pedirse el dato DIA hasta que se a introduzca correctamente.

Descripcin por pasos del algoritmo o


El programa para la conversin de fecha, mejorado para incluir la como probacin de que los datos introducidos son coherentes, se compondr de los o a siguientes pasos: Paso 1 Descripcin o Ejecutar la interrupcin de lectura de dato o numrico desde teclado para leer A~O y situarlo e N en D1. Si A~O 0, saltar al paso 1 para volver a pedir N el dato. Si A~O 2007, saltar al paso 1 para volver a N pedir el dato. Pseudocd. o input A~O D1 N

2 3

To 1 if A~O 0 N D3 D1

28

4 5

En caso contrario, almacenar A~O en D3. N Ejecutar la interrupcin de lectura de la variao ble MES (cadena de caracteres). El registro A1 apuntar a la zona de memoria ($00) en la que a el simulador sit a la cadena le u da. Hacer que el registro A3 apunte a V4, vector que contiene las direcciones de inicio de las cadenas ASCII correspondientes a los nombres de los meses; dicho vector est almacenado en a la zona de memoria etiquetada como DIR M. Inicializar CONTADOR, variable que emplearemos para comparar los sucesivos nombres con la cadena introducida. Inicio del bucle de comparacin de la cadena o con el nombre del mes. Hacer que A2 apunte a la direccin contenida en la zona de memoo ria apuntada por A3. Emplearemos direccionamiento indirecto con post-autoincremento. Hacer que A1 apunte a la direccin de memoo ria $00, en la que el simulador ha situado la cadena introducida por teclado. Invocar a la subrutina COMPARA CADENAS. Si D1 = 1, el resultado de la comparacin deo vuelto por la subrutina es positivo (las cadenas son iguales). Saltar al paso 15. Incrementar CONTADOR. Si CONTADOR 11, saltar al paso 8 para efectuar la comparacin con el siguiente nombre o de mes. En caso contrario, las cadenas introducidas no coinciden con ninguno de los nombres de mes. Saltar al paso 5 para volver a leer MES. Hacer que A1 apunte al inicio de V1, vector que contiene el n mero de d de cada mes, u as situados en orden inverso. Lectura del d del mes. Ejecutar la interrupa cin de lectura de dato numrico desde teclado o e para leer DIA y situarlo en D1. Hacer que A1 apunte a la posicin de V1 indio cada por 11 CONTADOR. Copiar el contenido de la celda de V1 apuntada por A1 a AUX. Emplearemos direccionamiento indirecto a registro. Si DIA 0, saltar al paso 16 para volver a pedir el dato.

To 1 if A~O 2007 N input MES (A1)

A3 #DIR M

D4 0

A2 (A3)+

A1 $00

10 11

To CMP CAD To 15 if D1 = 1

12 13

D4 D4 + 1 To 8 if D1 11

14

To 5

15

A1 #DIAS M

16

input DIA D1

17 18

D4 11 D4; A1 A1 + D4 D2 (A1)

19

To 16 if D1 0.

29

20

21 22 23

24

25 26

27 28 29 30

Si DIA > AUX, saltar al paso 16 para volver a To 16 if D1 > D2 pedir el dato. En caso contrario, el programa contin a normalmente. u Sit a en D2 el contenido de la operacin 12 u o D2 12 D4 CONTADOR. Realizar la operacin 365 (2006 A~O) a al- D3 365(2006D3) o N macenar su resultado en D3. Inicializar la variable CONTADOR, que empleaD5 12 remos para acceder a los datos del vector V1, que contiene el n mero de d de cada mes. u as Hacer que A1 apunte al inicio del vector V1, siA1 #DIAS M tuado en la zona de memoria etiquetada como DIAS M. Inicializar la variable AUX, en la que se irn a D6 0 almacenando los elementos le dos de V1. D6 (A1)+ Copiar el dato situado en la posicin de V1 o apuntada por A1 en la variable AUX. Emplearemos direccionamiento indirecto a registro con post-autoincremento. Decrementar la variable CONTADOR. D5 D5 1 Sumar el contenido de la variable AUX al cmputo total de d almacenado en D3. o as, Si CONTADOR MES, saltar al paso 26. Restar la variable DIA del cmputo total de o d transcurridos. (Tras este paso, el registro as D3 contiene el n mero de d transcurridos u as hasta el 31 de diciembre de 2006 ). Incrementar el n mero de d en una unidad. u as Efectuar la divisin entera del n mero de d o u as (D3) entre 7 (el cociente se almacenar en la a palabra menos signicativa de D3 y el resto en la palabra ms signicativa). Permutar las dos a palabras de D3. Hacer que A1 apunte al inicio del vector V2 (situado en la zona de memoria etiquetada como DIR D), que contiene las direcciones de inicio de las cadenas ASCII correspondientes a los nombres de los d de la semana. as Posicionar el apuntador de A1 en la celda de V2 que contenga la direccin del d de la seo a mana correspondiente a la anterior operacin o D3 mod 7. Puesto que las direcciones ocupan una palabra de memoria, debe multiplicarse por dos el resultado de dicho clculo para que a la operacin se efect e correctamente. o u D3 D3 + D6 To 26 if D5 D2 D3 D3 DIA

31 32

D3 D3 + 1 D3 D3 mod 7

33

A1 #DIR D

34

A1 A1 + 2 D3

30

35

36

37

38

39

40

Situar en A2 el contenido de la direccin de o memoria apuntada por A1. Se emplea direccionamiento indirecto a registro. Inicio del bucle de escritura. Situar en D1 el carcter apuntado por A2. Se emplea direccioa namiento indirecto con postautoincremento. Si el cdigo le corresponde al carcter nulo o do a (bit de estado Z a 1), saltar al paso 40 para nalizar el programa. En caso contrario, ejecutar la interrupcin de o escritura en pantalla del carcter almacenado a en D1. Si el cdigo le no corresponde al carcter o do a nulo (bit de estado Z a 0), saltar al paso 36 para repetir el bucle de escritura. Fin del programa.

A2 (A1)

D1 (A2)+

To 40 if Z = 1

output D1

To 36 if Z = 0

END

El diagrama de ujo del programa CONVERTIR FECHA MEJORADO se muestra en la gura 6, situada al nal de esta memoria de prcticas. a

Codicacin en ensamblador o
El cdigo en el ensamblador del MC68000 propuesto para la resolucin del o o problema se lista a continuacin: o
*----------------------------------------------------------* Program :CONVERTIR_FECHA_MEJORADO * Written by :Miguel Moro Vallina * Date :19 de agosto de 2007 * Description:Muestra el da de la semana de una fecha * introducida por teclado, comprobando * adems la coherencia de los datos introducidos a *----------------------------------------------------------CNV_F_M ORG $1000 BCL_A MOVE.B #4,D0 Paso 1. Lee la variable A~O N TRAP #15 desde el teclado CMP.W #0,D1 Paso 2. Si A~O menor o igual N BLE BCL_A que 0 salta a BCL_A para * volver a pedir dato N CMP.W #2007,D1 Paso 3. Si A~O mayor o igual que BGE BCL_A 2007, salta a BCL_A para volver * a pedir dato. MOVE.W D1,D3 Paso 4. En caso contrario, N * almacena A~O en D3 BCL_M MOVE.B #2,D0 Paso 5. Lee la variable MES TRAP #15 (string) desde el teclado. MOVEA.W #DIR_M,A3 Psdo 6. A3 apunta a V4 MOVEQ #0,D4 Paso 7. Inicializa CONTADOR BCL_CMP MOVEA.W (A3)+,A2 Paso 8. A2 apunta a inicio de * cadenas MOVEA.W #$00,A1 Paso 9. BSR CMP_CAD Paso 10.

31

CMP.B BEQ ADDI CMP.B BLE BRA * CONT * BCL_D

#1,D1 CONT #1,D4 #11,D4 BCL_CMP BCL_M

MOVEA.W #DIAS_M,A1 MOVE.B TRAP NEG ADDI ADDA.W MOVE.B CMPI.B BLE CMP.B BLT #4,D0 #15 D4 #11,D4 D4,A1 (A1),D2 #0,D1 BCL_D D1,D2 BCL_D

* * NEG ADDI MOVE.B NEG ADDI MULU MOVEQ MOVEA.W * BUCLE MOVEQ MOVE.B SUBI ADD.W CMP BLE SUB.W ADDI DIVU SWAP MOVEA.W MULU ADDA.W MOVEA.W #0,D6 (A1)+,D6 #1,D5 D6,D3 D5,D2 BUCLE D1,D3 #1,D3 #7,D3 D3 #DIR_D,A1 #2,D3 D3,A1 (A1),A2 D4 #12,D4 D4,D2 D3 #2006,D3 #365,D3 #12,D5 #DIAS_M,A1

Paso 11. Si D1=1, salta a la lectura del dia Paso 12. Incrementa CONTADOR Paso 13. Si CONTADOR menor que 11, salta a BCL_CMP. Paso 14. En caso contrario, vuelve a pedir MES Paso 15. Sita en A1 la direccin u o de DIAS_M Paso 16. Lee la variable DIA desde el teclado Paso 17. D4=11-D4 A1 apunta a V1[D4] Paso 18. Copia el nmero de das u del mes a D2 Paso 19. Si D1 menor o igual que 0, vuelve a pedir DIA Paso 20. Si D1 mayor que D2, vuelve a pedir DIA. En caso contrario, contina con el u programa normalmente. Paso 21. D2=12-D4 Paso 22. Resta 2006-A~O N Multiplica 365*(2006-A~O) N Paso 23. Inicializa CONTADOR Paso 24. Sita en A1 la u direccin de DIAS_M o Paso 25. Inicializa AUX Paso 26. Paso 27. Decrementa CONTADOR Paso 28. D3=D3+AUX Paso 29. Si CONTADOR mayor que MES, salta a BUCLE Paso 30. D3=D3-DIA Paso 31. Paso 32. D3=D3 mod 7 Paso 33. A1 apunta a V2[0] Paso 34. A1 apunta a V3[D3] Paso 35. A2 apunta a la direccin de inicio de o la cadena corresp. Paso 36. Bucle de escritura Paso 37. Si el cdigo ledo o es $00, salta a FIN Paso 38. Muestra en pantalla el caracter contenido en D1.B Paso 39. Si el cdigo ledo no o es $00, salta a BUC_S Paso 40. Fin de programa

* * BUC_S *

MOVE.B BEQ MOVE.B TRAP BNE

(A2)+,D1 FIN #6,D0 #15 BUC_S

* FIN STOP #$2000

*-----------------------------------------------------------* Zona de datos *------------------------------------------------------------

32

DATOS DIAS_M DIAS DIR_D DIR_LU DIR_DO DIR_SA DIR_VI DIR_JU DIR_MI DIR_MA NOM_D LUN

DOM

SAB

VIE

JUE

MIE

MAR

ORG DS.B ORG DC.B ORG DS.W ORG DC.W DC.W DC.W DC.W DC.W DC.W DC.W ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.W ORG DC.W DC.W DC.W DC.W DC.W DC.W DC.W DC.W DC.W

$3000 12 $3000 31,30,31,30,31,31,30,31,30,31,28,31 $300C 7 $300C $3020 Direccin de la cadena o $3026 Direccin de la cadena o $302E Direccin de la cadena o $3036 Direccin de la cadena o $303E Direccin de la cadena o $3046 Direccin de la cadena o $3050 Direccin de la cadena o $3020 6 $3020 $6C,$75,$6E,$65,$73 0 Final de "lunes" $3026 8 $3026 $64,$6F,$6D,$69,$6E,$67,$6F 0 Final de "domingo" $302E 7 $302E $73,$61,$62,$61,$64,$6F 0 Final de "sbado" a $3036 8 $3036 $76,$69,$65,$72,$6E,$65,$73 0 Final de "viernes" $303E 7 $303E $6A,$75,$65,$76,$65,$73 0 Final de "jueves" $3046 10 $3046 $6D,$69,$65,$72,$63,$6F,$6C,$65,$73 0 Final de "miercoles" $3050 7 $3050 $6D,$61,$72,$74,$65,$73 0 Final de "martes" $3060 13 $3060 $3080 $3086 $308E $3094 $309A $30A0 $30A6 $30AC $30B4

"lunes" "domingo" "sabado" "viernes" "jueves" "miercoles" "martes"

DIR_M DIR_EN DIR_FE DIR_MZ DIR_AB DIR_MY DIR_JN DIR_JL DIR_AG DIR_SE

Direccin o Direccin o Direccin o Direccin o Direccin o Direccin o Direccin o Direccin o Direccin o

de de de de de de de de de

"enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre"

33

DIR_OC DIR_NO DIR_DI

DC.W DC.W DC.W DC.W ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B ORG DC.B DC.B ORG DS.B

$30C0 $30C8 $30D2 $0000

Direccin de "octubre" o Direccin de "noviembre" o Direccin de "diciembre" o Fin de direcciones meses

NOM_M ENE

FEB

MRZ

ABR

MAY

JUN

JUL

AGO

SEP

OCT

NOV

$3080 6 $3080 $65,$6E,$65,$72,$6F 0 Final de "enero" $3086 8 $3086 $66,$65,$62,$72,$65,$72,$6F 0 Final de "febrero" $308E 6 $308E $6D,$61,$72,$7A,$6F 0 Final de "marzo" $3094 6 $3094 $61,$62,$72,$69,$6C 0 Final de "abril" $309A 5 $309A $6D,$61,$79,$6F 0 Final de "mayo" $30A0 6 $30A0 $6A,$75,$6E,$69,$6F 0 Final de "junio" $30A6 6 $30A6 $6A,$75,$6C,$69,$6F 0 Final de "julio" $30AC 7 $30AC $61,$67,$6F,$73,$74,$6F 0 Final de "agosto" $30B4 11 $30B4 $73,$65,$70,$74,$69,$65,$6D,$62,$72,$65 0 Final de "septiembre" $30C0 8 $30C0 $6F,$63,$74,$75,$62,$72,$65 0 Final de "octubre" $30C8 10 $30C8 $6E,$6F,$76,$69,$65,$6D,$62,$72,$65 0 Final de "noviembre" $30D2 10

34

DIC

ORG DC.B DC.B

$30D2 $64,$69,$63,$69,$65,$6D,$62,$72,$65 0 Final de "diciembre"

*-----------------------------------------------------------* Zona de subrutinas *-----------------------------------------------------------SUBS ORG CMP_CAD ORG BUC_CMP MOVE.B MOVE.B CMP.B BNE CMP.B BNE * IGUAL * DESIG * FIN_S MOVE.B BRA MOVE.B RTS MOVE.B TRAP END #9,D0 #15 CNV_F_M $4000 $4000 (A1)+,D5 (A2)+,D6 D5,D6 DESIG #$00,D5 BUC_CMP #1,D1 FIN_S #0,D1

Paso 1. Paso 2. Paso 3. Si D5 no es igual que D6, salta al paso 7 Paso 4. Si D5 no es igual a $00 (car. nulo), salta a paso 1 para repetir bucle. Paso 5. Iguales: sita 1 en D1 u Paso 6. Salta al paso 8 (fin de programa Paso 7. Desiguales: sita 0 u en D1 Fin de subrutina

Halt Simulator

Inicio

~ Leer ANO D1 No S A~O 0? N No A~O 2007? N S D3 D1

Leer MES D1 A3 #DIR M D4 0 A2 (A3)+ A1 $00 To CMP CAD

D1 = 0? S No D4 D4 + 1 S

D1 11?

No

A1 #DIAS M

Leer DIA D1 D4 11 D4 D2 (A1) S

D1 0? No D1 > D2? S No D2 12 D4

D3 365 (2006 D3) D5 12 D4 #DIAS M D6 0 D6 (A1)+ D5 D5 1 D3 D3 + D6 S

D5 D2? No D3 D3 DIA D3 D3 + 1 D3 D3 mod 7 A1 #DIR D A1 A1 + 2 D3 A2 (A1) D1 (A2)+ S

Z = 1? No Escribir D1

Z = 0? S No Fin

Figura 6. Diagrama de ujo del programa CONVERTIR FECHA MEJORADO.

You might also like