Professional Documents
Culture Documents
Y
MICROCONTROLADORES
PRACTICA III
DNI:
C.A. Pamplona
1
ENUNCIADO PRCTICA
Primera parte
Realizar un programa en el ensamblador del MC68000 que nos diga el da de la semana que fue
(de Lunes a Domingo) un da concreto facilitado por teclado.
En concreto, el programa preguntar, de forma independiente:
Primeramente, el ao.
Segunda parte
Mejorar el programa anterior para que, en vez de preguntarnos el nmero de mes, nos pregunte
el nombre del mes (de Enero a Diciembre). 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 D1
si son iguales, y 0 en D1 si son diferentes.
Tercera parte
Mejorar el apartado b para comprobar que los tres datos introducidos por teclado son vlidos.
El nombre del mes tiene que ser uno de los doce posibles, todo en minsculas.
El da del mes tendr que ser vlido para el mes que hemos introducido (por ejemplo, si el mes
introducido es "febrero", el da del mes estar en el rango [1,28]).
Cuando se introduzca un dato no vlido, el programa volver a pedir justo ese dato continuamente
hasta que se introduzca bien.
Ejemplo: Nos han pedido el ao y lo hemos metido bien. Pero ahora metemos un mes errneo. El
programa nos volver a pedir el mes hasta que lo metamos bien. Es entonces cuando nos pedir el da de
mes.
ENTREGA PRCTICA
NOTA: Con el objetivo de simplificar la prctica, en todos los apartados no se tendrn en cuenta
los aos bisiestos, es decir, se supondr que todos los aos tienen 365 das.
2
MEMORIA DE LA PRCTICA
APARTADO A
El programa est estructurado de tal manera que hay una rutina principal, desde la que se llama a
todas las subrutinas. En la figura siguiente se muestra el diagrama de flujo de la rutina principal, en la
que se comentan los parmetros de entrada a cada subrutina, as como los valores que devuelven.
INICIO
FIN
3
En el programa se ha reservado una zona de memoria, en la que se han introducido los
nombres de los das de la semana, as como los mensajes que aparecern en pantalla
solicitando la introduccin de los datos.
La zona de memoria etiquetada como DTRA almacena los valores que se usarn para
calcular posteriormente el da de la semana. Son doce valores que reflejan los das
acumulados dentro de cada ao hasta el mes anterior al introducido. En enero sern 0 das,
en febrero los 31 das de enero, en marzo los 59 acumulados hasta entonces y as
sucesivamente. La finalidad de esto se explicar con ms detalle al explicar la subrutina
correspondiente.
*----------------------------------------------------------
*
* ZONA DE DATOS
*
*----------------------------------------------------------
*-----------------------------------------------------------
* Introduccion en memoria de dias de la semana
*-----------------------------------------------------------
*----------------------------------------------------------
* N de das transcurridos a lo largo de los meses del ao
* (Dias transcurridos hasta enero, febrero,...diciembre)
*----------------------------------------------------------
DTRA ORG $2080
DC.W 0,31,59,90,120,151,181,212,243,273,304,334
DC.B 0
*---------------------------------------------------------
* Mensajes por pantalla
*---------------------------------------------------------
4
En las tres figuras siguientes, se muestran los diagramas de flujo de las subrutinas que
se encargan de sacar un mensaje por pantalla solicitando la entrada del ao, mes y da, y
guardar la respuesta en los registros D4, D5 y D6. Los mensajes se preguntan en ingls
porque resultaba algo embarazoso al preguntar por el ao sin contar con la letra en este
simulador. En este primer apartado, el programa no supervisa ni corrige los posibles errores
derivados de introducir datos fuera de los intervalos solicitados que son:
Ao: 1-2006
Mes: 1-12
Da: En funcin del mes, en ningn caso se tendrn en cuenta los bisiestos.
YEAR
D4 D1 Ao en D4
RTS
5
Subrutina de solicitud del mes (1-12):
MONT
D5 D1 Mes en D5
RTS
6
Subrutina de solicitud del da:
DAY
D6 D1 Dia en D6
RTS
7
Subrutina CALC:
En los datos de partida conocemos que el da uno de enero de 2007 es lunes y el
programa debe funcionar para fechas desde el uno de enero del ao uno hasta el uno de enero
de 2007.
Esta subrutina se encarga de calcular los das transcurridos desde el 1-1-1 hasta el 1-1-
2007. Este clculo se podra haber hecho en tiempo de diseo y haber guardado el dato en
memoria para haberlo usado ms tarde pero he optado por esta opcin que refleja ms claro en
el programa el objetivo. El clculo se devolver en D7.
En la figura siguiente se encuentra el diagrama de flujo de esta subrutina.
CALC
D7 365
D1 2006
D7 D1 x D7
RTS
Subrutina CALCU:
Esta subrutina se encarga de calcular los das transcurridos desde el 1-1-1 hasta la fecha
introducida. Para ello calcula los das debidos a los aos. Si se introduce el ao 1901, se
multiplica 365 por 1900 (1900 -1). A esto se suman los das transcurridos por concepto de los
meses. Si se ha introducido marzo, se sumarn los 59 das de enero y marzo; para ello se
recurre a la direccin de memoria etiquetada como DTRA. Finalmente se suman los das
debidos al da introducido por pantalla, Por ejemplo, introducimos 3 de marzo de 2001
8
CALCU
D1 D4 AO EN D1
D2 D5 MES EN D2
D2 D6 DIA EN D3
D1 D1 - 1 AO = AO -1
D2 D2 - 1 MES = MES -1
RTS
9
Subrutina DISEM:
Recibe los datos de D7 (das transcurridos desde 1-1-1 hasta 1-1-2007) y de D1 (das
transcurridos desde 1-1-1 hasta la fecha introducida).
1- Restar estas cantidades para hallar los das que hay entre la fecha introducida y el 1-1-2007. Este
dato se guarda en D0.
2- Dividir esta cantidad entre 7 (das de la semana). El resto de esta divisin nos revelar el da de la
semana que es la fecha introducida (0 lunes, 1 domingo, 2 sbado,, 6 martes).
3- Se comprueba si ha habido desbordamiento en la divisin. Hay que tener en cuenta que el
resultado da el cociente en la palabra de menos peso y el resto en la de ms peso. Por lo tanto, si
el resultado de la divisin es superior a 65.535 habr desbordamiento. Si hay desbordamiento,
no se produce la divisin, se resta 7 al dividendo y se vuelve a repetir hasta que no haya
desbordamiento.
4- Este dato (0 a 6) se guarda en D1 y se devuelve el control a la rutina principal.
DISEM
D7 D0
D0 D0 - 7 D7 D7 / 7 Division entre 7
NO
D1 0
RTS
10
Subrutina DIRDIA:
DIRDIA
TRAP 15
RTS
11
ENSAMBLADO Y SIMULACION
El programa se encuentra en la carpeta con el nombre p3-apartado 1.x68
*----------------------------------------------------------------
* Program : Practica 3
* Written by : Juan Carlos Irigoyen Calvo
* Date : 28 de febrero de 2008
* Description: Determina dia de la semana para una fecha
* desde 1 de enero de ao 1 hasta 1 de enero de 2007
* (No tiene en cuenta los bisiestos)
* No detecta datos fuera de estos margenes.
*----------------------------------------------------------------
START ORG $1000
BSR YEAR PREGUNTA AO
BSR MONTH PREGUNTA MES
BSR DAY PREGUNTA DIA
BSR CALC DIAS DESDE 1-1-1 HASTA 1-1-2007 EN D7
BSR CALCU DIAS DESDE 1-1-1 HASTA FECHA EN D1
BSR DISEM DIA DE LA SEMANA EN D1
BSR DIRDIA IMPRIME NOMBRE DEL DIA
MOVE.B #9,D0
TRAP #15 halt simulator
*-----------------------------------------------------------
* PETICION DE DATOS
*-----------------------------------------------------------
12
*--------------------------------------------------------------
* SUBRUTINAS
*--------------------------------------------------------------
ADD.L D2,D1
ADD.L D3,D1 DIAS TRANSCURRIDOS DESDE 1 DE ENERO DE AO 1
RTS
13
ENSAMBLADO Y SIMULACION:
Se procede al ensamblado del cdigo fuente generndose los
archivos del mismo nombre pero con extensiones .L68 y .S68
El ensamblado muestra que no hay errores como se puede apreciar
en la siguiente captura:
En las 2 siguientes capturas de pantalla se muestran las simulaciones para los das 1
de enero del ao 1 que da Jueves, y da 31 de diciembre de 2006, que da domingo.
14
15
APARTADO B
Se solicita en este apartado una modificacin del programa anterior para que los meses
se introduzcan por sus nombres as como la creacin de una subrutina de comparacin de
dos cadenas de texto, para el mes introducido y los meses del ao almacenados en memoria.
Para cumplir con este objetivo solo es necesario sustituir la subrutina MONTH por la
MONTH2 y aadir la subrutina COMCAD que comparar las dos cadenas de texto y que ser
llamada por MONTH2.
INICIO
DIRDIA Recibe dia semana en D1 y saca por pantalla el nombre del da de la semana
FIN
16
La zona de datos cuenta adems con dos apartados ms:
1-Nombres de los meses del ao situados a partir de la direccin $2100 y espaciados $10
bytes, que como veremos facilitar su acceso iterativo para compararlos con el texto
introducido por teclado.
*----------------------------------------------------------
* Nombres de los meses del ao
*----------------------------------------------------------
NBR_ME ORG $2100
DC.B 'enero',0
ORG $2110
DC.B 'febrero',0
ORG $2120
DC.B 'marzo',0
ORG $2130
DC.B 'abril',0
ORG $2140
DC.B 'mayo',0
ORG $2150
DC.B 'junio',0
ORG $2160
DC.B 'julio',0
ORG $2170
DC.B 'agosto',0
ORG $2180
DC.B 'septiembre',0
ORG $2190
DC.B 'octubre',0
ORG $21A0
DC.B 'noviembre',0
ORG $21B0
DC.B 'diciembre',0
*----------------------------------------------------------
* Espacio de memoria para mes introducido
*----------------------------------------------------------
DATMES ORG $2200
DS.B 16
17
Subrutina MONTH2:
Esta subrutina se encarga de solicitar el mes por pantalla y de recibirlo guardando el texto en la
posicin de memoria reservada con la etiqueta DATMES. A su vez se guarda en D5 el n del mes
calculado con este algoritmo, por lo que el funcionamiento a partir de aqu ser idntico que en el
apartado anterior.
1- Se inicializa D5 a cero. Servir para ir contando los meses que se comparan con la cadena
introducida de tal manera que tras cada comparacin se incrementa su valor en uno.
2- Se introduce el valor de la direccin donde estn los meses del ao en A1 y la direccin de la
cadena introducida en A1
3- Se copia el valor de D5 en D7 para operar con el sin perder el valor original que seguir en D5
4- Se calcula el salto hexadecimal desde la direccin de inicio de los meses del ao en memoria
(NBR_MES) hasta el inicio del siguiente mes a comparar. Por ejemplo, si el mes es mayo, se
habrn recorrido sucesivos bucles comparando cadenas hasta llegar a D7=D5= 4 (0 es enero).
Multiplica D7 por $10 y el resultado se lo suma a NBR_MES dando la direccin $2140 que es
donde se encuentra la cadena Mayo.
5- Se invoca la subrutina COMCAD que devolver un 1 si son iguales y un 0 si son diferentes en el
registro de datos D1.
6- Si tras comparar con los doce meses no hay resultado positivo, se vuelve al principio y se vuelve
a preguntar el mes, aunque esto se pide en el apartado 3.
Subrutina COMCAD:
Esta subrutina recibe 2 cadenas apuntadas por las direcciones A1 y A2, las compara y el resultado
lo devuelve en D1, 1 si son iguales y 0 si son diferentes.
El algoritmo consiste en recorrer los bytes de las dos cadenas desde el principio comparndolos
uno a uno, valindose para ello de una carga desde memoria a los registros D0 y D2 para las respectivas
cadenas. Se comparan los 2 bytes sucesivamente hasta que ocurran una de las dos siguientes cosas:
1- En un momento los dos bytes son distintos. Entonces se pone el registro D1 a cero y se retorna a
MONTH2.
2- Se llega al final de las cadenas (un cero). Esto quiere decir que las dos cadenas son iguales. Se
devuelve un uno en D1 a MONTH2.
18
MONT2
SI A1 #DATMES Bucle BU
D1 = 1 ? SI
NO
D5 D5 + 1
D5 = 11 ?
NO
Aumenta indice mes y
vuelve bucle BU para
D5 D5 + 1 comparar con mes
siguiente
RTS
19
MONTH2
*----------------------------------
* Peticin de mes
* enero a diciembre
* (En minsculas)
*----------------------------------
MONTH2 ORG $1200
MOVEQ #13,D0 IMPRIME TEXTO MONTH?
MOVE.L #INTMES,A1
TRAP #15
MOVE.L #DATMES,A1 A1 apunta reserva memoria entrada de mes
MOVEQ #2,D0 Funcin entrada texto
TRAP #15 Mes introducido en memoria (#DATMES)
MOVE.L #0,D5 Registro D5 a cero (ndice de meses 1-12)
*------------------------------------------------------------------------
* Este bucle comienza a recorrer todas las posiciones de memoria donde
* estn los nombres de los meses usando D7 como ndice que aumenta en cada
* bucle. Con el calculo de esta posicin de memoria en A2 y el mes
* introducido en memoria (A1), se enva a comparar a subrutina COMCAD
* hasta encontrar el mes que coincida con el introducido. En ese momento
* D7 tendr el valor numrico del mes (0-11), que devolveremos a D5 sumndole
* uno para tener el valor del mes (1-12) con el que operaremos ms tarde
*--------------------------------------------------------------------------
20
COMCAD
COMCAD
SI
D0 (A1) BYTE DE DIRECCION MEMORIA A1 A D0 Y
A1 A1 + 1 APUNTA SIGUIENTE CARACTER
SI
SI
RTS
21
ENSAMBLADO Y SIMULACION
El cdigo fuente se encuentra en el archivo p3-apartado 2.X68 y se produce el
ensamblado sin errores como se muestra en la siguiente captura de pantalla.
22
23
APARTADO C
En este apartado se debe mejorar el apartado anterior programando cdigo para que no se
permitan la entrada de aos fuera del intervalo [1,2006], meses inexistentes (algo que ya se hizo en
apartado anterior, y que el da introducido est dentro del intervalo para ese mes, es decir enero 31 das,
febrero 28 das,
Dentro de la zona de datos se introducen a partir de la etiqueta DIAS la longitud en das de los
sucesivos meses del ao:
*----------------------------------------------------------
* N de das de meses enero a febrero
*----------------------------------------------------------
DIAS ORG $2070
DC.B 31,28,31,30,31,30,31,31,30,31,30,31
Slo se ven modificadas las subrutinas YEAR y DAY, que quedan suficientemente claras en los
siguientes diagramas de flujo as como en el cdigo siguiente:
*---------------------------------
* Peticion de ao
*---------------------------------
YEAR ORG $1500
MOVEQ #13,D0 IMPRIME TEXTO YEAR?
MOVE.L #INTA,A1
TRAP #15
MOVEQ #4,D0 LEE AO
TRAP #15
CMP #2006,D1
BGT YEAR Si es mayor que 2006 vuelve a preguntar
CMP #1,D1
BLT YEAR Si es menor que 1 vuelve a preguntar
MOVE.L D1,D4 AO EN D4
RTS
*--------------------------------------------
* Peticin de da
*--------------------------------------------
24
YEAR
SI
SI
D0 4 N de funcion del Trap en D0
D1 > 2006 ?
NO
D1 < 1 ?
NO
D4 D1 Ao en D4
RTS
25
DAY
SI
NO
D7 D7 - 1
D7 0 Reset D7
NO
D6 D1 Dia en D6
RTS
26
ENSAMBLADO Y SIMULACION
El cdigo fuente para este apartado se encuentra en el archivo P3-apartado 3.X68.
En las sucesivas capturas se aprecian simulaciones en que se han introducido a propsito datos
errneos para comprobar que se vuelve a preguntar hasta generar un resultado correcto.
27
28
29