Professional Documents
Culture Documents
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
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;
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
8 9 10 11 12 13 14
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.
D4 D2 D1? No A1 A0 + D1 D3 (A1) D1 D1 + 1 S
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.
Mueve AUX a V(CONTADOR) Paso 12. Incrementa CONTADOR Paso 13. Si D1 menor que D2 repite BUCLE Paso 14. Retorno al programa principal
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
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
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
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;
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
13
D1 = 0? No D0 D0 + 1 To INVERT Fin
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
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.
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
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.
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
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?
Z = 1? No Escribir D1
Z = 0? S No Fin
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
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
Halt Simulator
22
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
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
24
D2 = D3? No S D2 = 0? No D1 1 D1 0 Fin
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.
26
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.
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.
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
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 *
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
DIR_M DIR_EN DIR_FE DIR_MZ DIR_AB DIR_MY DIR_JN DIR_JL DIR_AG DIR_SE
de de de de de de de de de
33
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
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
*-----------------------------------------------------------* 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
D1 = 0? S No D4 D4 + 1 S
D1 11?
No
A1 #DIAS M
D1 0? No D1 > D2? S No D2 12 D4
Z = 1? No Escribir D1
Z = 0? S No Fin