INICIO MOVE.B NUM1,D0 ; Calcula el mayor MOVE.B #VEINTE,D0 ; Igual que la anterior MOVE.B NUM2,D1 MOVE.B NUM3,D2 CMP.B D1,D0 BGE COMPARA MOVE.B D0,D3 MOVE.B D1,D0 MOVE.B D3,D1 COMPARA CMP.B D2,D0 BGE FIN MOVE.B D0,D3 MOVE.B D2,D0 FIN MOVE.B D3,D1 MOVE.B D0,MAYOR BREAK
END 3
Ejercicios de la Sesin 2 (Introduccin al Ensamblador)
Ejercicios de introduccin ensamblador, para realizar en el laboratorio de prcticas con ayuda del profesor.
1. Repaso de Directivas: ORG, DC, EQU a. Indicar el contenido de las variables PER1 y PER2 una vez finalizada la ejecucin del programa que aparece a continuacin:
ORG $500 INI MOVE.B LAD1,D0 ADD.B LAD2,D0 MOVE.B D0,PER1 ADD.B TAM,D0 MOVE.B D0,PER2 BREAK END
b. Utilizando las directivas del ensamblador, declarar las variables siguientes a partir de la direccin $1000 de memoria:
PAL, tamao palabra, sin valor inicial OCT, tamao octeto, con valor inicial A LONG, tamao doble palabra, con valor inicial 12345678 VECTOR_PAL, array de palabras con 10 elementos, sin valor inicial VECTOR_OCT, array de octetos con 12 elementos, con valor inicial Arquitectura VECTOR_LONG, array de dobles palabras con 5 elementos, sin valor inicial 4
2. Tamao de los Operandos a. Dado el programa siguiente, indicar el contenido de los registros D0, D1, D2, D3, A0, A1 y A2, una vez finalizada la ejecucin del mismo.
3. Declaracin y Acceso a Variables Vectoriales a. Completar el programa de abajo para que realizase una copia de un vector en otro idntico. El vector origen tiene 4 elementos de tamao doble palabra. No se deber utilizar ninguna instruccin de salto.
* p3a ORG $0 DC.L $10000 DC.L INICIO
ORG $400 ; Las variables a partir de $400 VEC1 DC.L 5,$6,%00000110,20 VEC2 DS.L 4 VEC3 DS.L 4 VEC4 DS.L 4
ORG $500 ; El codigo a partir de $500
bloque de instrucciones que hay que escribir
BREAK END 5
4. Operaciones Aritmticas, Lgicas y de Desplazamiento. a. Escribir un programa que realice la suma, resta y multiplicacin de dos variables (B y C), previamente declaradas como variables de tamao palabrea e inicializadas con los valores 11 y 12 respectivamente, dejando los resultados en tres variables: SUMA (B+C), RESTA (C-B) y MULTI (B*C), declaradas como variables de tamao palabra, sin valor inicial. b. Escribir un programa que calcule las 8 primeras potencias de 2 (2 0 hasta 2 7 ), utilizando, para los clculos, exclusivamente instrucciones de desplazamiento. Los resultados debern almacenarse en un vector de ocho elementos de tamao octeto.
5. Bucles. a. Escribir un programa que rellene un vector con los diez primeros nmeros naturales. Los elementos del vector son de tamao doble palabra. Para realizar la inicializacin se debe utilizar un bucle WHILE. b. Igual que en el apartado anterior, pero utilizando REPEAT. c. Escribir un programa que busque la posicin del nmero ms pequeo en un vector de 10 elementos de tipo palabra. El resultado deber almacenarse en una variable de tipo palabra. El valor inicial del vector es: 4, 6, 5, 3, 2, 1, 9, 0, -1, -1.
6. Caracteres y Nmeros a. Dadas las siguientes variables:
Comprobar, mediante el visor de memoria del simulador, los valores almacenados en memoria a partir de las direcciones $400 y $500. Cul es la diferencia? Existe alguna diferencia entre las posiciones de memoria de las direcciones $600, $700 y $800? (Al mostrar el mensaje "Fin de la Aplicacin" pulsar "Aceptar" para ver el resultado).
6
b. Escribir un programa que inicialice un vector con las letras maysculas (desde la A a la Z).
c. Escribir un programa que a partir de los valores del vector CARS (del apartado 6a) obtenga los valores de NUMS, dejndolos en un nuevo vector de 10 elementos de tamao palabra. 7
EJERCICIOS RECOMENDABLES PARA REALIZAR FUERA DE LA SESIN DE PRCTICAS
1. Realizar un programa que almacene en memoria RAM, a partir de la direccin $1000, los 30 primeros nmeros mltiplos de tres.
2. Paso de parmetros en la pila. Seguir la ejecucin del programa siguiente. Despus, modificar los parmetros para que sean de tipo LONG y BYTE.
ORG $0 DC.L $8000 DC.L INICIO
DATOS DCB 8,$AAAA
ORG $2000 INICIO MOVE.W #DATOS,A2 ; Pasamos el 1er. Parmetro en la pila MOVE.W A2,-(SP) MOVE.W #$00,D2 ; Pasamos el 2do. parametro MOVE.W D2,-(SP) BSR BORRAR BREAK
BORRAR MOVE.W 4(SP),D0 ; Recuperamos los parmetros MOVE.W 6(SP),A0 BUCLE MOVE.W D0,(A0) ADDQ #2,A0 CMP #$1010,A0 BNE BUCLE RTS END
3. Realizar una subrutina que tenga dos parmetros de entrada (base y exponente) que calcule la funcin base exponente .
a. Estructurar el programa para pasar los parmetros en registros de datos. b. Estructurar el programa para pasar los parmetros en la pila del sistema.
4. Escribir un programa que calcule la funcin factorial por medio de una subrutina que acepte un parmetro de entrada a travs de la pila. La funcin debe ser recursiva. 8
Ejercicios de la Sesin 3 (E/S por polling)
* Fichero: sondeo.asm * --- Ejemplo de E/S por polling. * Este programa debe sacar la ristra de caracteres Arquitectura de Computadores * por la ventana de E/S del simulador, mediante sondeo. * No obstante, tiene algunos errores que no permiten realizar tal cometido
* Arranque del 68000 ORG $0 ; Comienzo Tabla Vectores de Interrupcion DC.L $10000 ; Valor Inicial SSP DC.L RESET ; PC Inicial
MENSAJE DC.B 'Arquitectura de Computadores',$0 * $A caracater Line Feed (LF) * $D caracter Carriage Return (CR) * $0 caracter NULL, indica el Final del String
* BEGIN * ORG $500
RESET: BSR INI_UART ; Call INI_UART
MOVE.L #MENSAJE,A1 ; A1 := ADDRESS (MENSAJE)
BUCLE: CMPI.B #0,(A1) ; While (A1) <> 0 do BEQ SALIR
POLL: BTST.B #2,UART+USR ; While TX-RDY = 0 do BEQ POLL ; End While
MOVE.B (A1)+,UART+TB ; Enviar_Car JMP BUCLE ; End While
SALIR: BREAK ; End Program
* PROC INI_UART() * INI_UART MOVE.L A0,-(SP) ; Push A0 MOVE.L #UART,A0 ; A0 := USART MOVE.B #%00010000,CR(A0) ; UART.CR = Habilitar MR1 MOVE.B #%00010011,MR1(A0) ; UART.MR1 = 8 bits por car. sin paridad MOVE.B #%00000111,MR2(A0) ; UART.MR2 = no RTS, no CTS, 1 bit Stop MOVE.B #%10111011,CSR(A0) ; UART.CSR = 9600 bps MOVE.B #%00000100,CR(A0) ; UART.CR = Habilitar Transmisor MOVE.L (SP)+,A0 ; Pop A0 RTS END 9
La prctica de esta sesin consta de varios apartados. En el primero hay que implementar unas subrutinas para manejar las UART mediante la tcnica de entrada/salida programada o polling. En los apartados siguientes se escribirn una serie de programas que harn diversos usos de las subrutinas escritas en el primer apartado.
Todos los apartados de la prctica se realizarn en el modo de funcionamiento supervisor del procesador Motorola 68000.
Apartado 1. Se pide desarrollar las subrutinas siguientes para manejar las UART mediante entrada/salida programada.
INI_UART (uart: WORD) Permite inicializar una UART. El parmetro uart es de tipo WORD, es decir, ocupa dos octetos y sus nicos valores posibles son: 0, 1 o 2, para referirse a cada una de las tres UARTS que se van a utilizar en el desarrollo de la prctica.
Esta subrutina programa la UART indicada en el parmetro, para comunicarse a 8 bits por carcter, sin paridad, un bit de STOP y una velocidad de transmisin/recepcin de 9.600 bits por segundo. Adems habilitar la recepcin y la transmisin de caracteres.
Es posible que una misma UART pueda inicializarse varias veces durante la ejecucin de un programa, por lo que conviene tener en cuenta la singularidad del funcionamiento de los registros MR1 y MR2.
ENV_CAR (uart: WORD; car: BYTE) Enva un carcter por una UART. El parmetro uart es de tipo WORD, es decir, ocupa dos octetos y sus nicos valores posibles son: 0, 1 o 2, para referirse a cada una de las tres UARTS utilizadas en la prctica. El parmetro car es de tipo BYTE. Esta rutina enviar el carcter (escribir en el registro TB) cuando la UART est preparada, y no devolver el control hasta que el ltimo bit del carcter haya salido por la lnea de comunicaciones.
REC_CAR (uart: WORD; VAR car: BYTE); Recibe un carcter de una UART. El parmetro uart es de tipo WORD y admite los mismos valores que en la subrutina ENV_CAR. El parmetro car, adems de ser de tipo BYTE, es de salida (paso de parmetro por referencia).
Esta subrutina no devolver el control hasta que se reciba un carcter por la UART indicada. 10
Apartado 2 Escribir el programa ECO, que deber enviar por el puerto de una UART todos los caracteres recibidos por su puerto, finalizando su ejecucin cuando reciba el carcter asterisco (*).
En este apartado se utilizar nicamente la UART 0, que tiene por nombre Port A (0) en el entorno de prcticas.
Tngase en cuenta que antes de poder enviar o recibir por una UART es necesario inicializarla.
Apartado 3 Escribir un programa que escriba por las UARTS 1 (Port B) y 2 (Port C) todo lo que lea de la UART 0 (Port A). Al igual que en el Apartado 2, el programa finalizar su ejecucin cuando reciba un asterisco (*).
11
Ejercicios de la Sesin 4 (E/S por Interrupciones)
1. Realizar un programa que muestre por un puerto de la UART los diez primeros valores exponenciales de base 2 (2 0 , 2 1 , 2 2 , , 2 9 ). Tener en cuenta que para visualizar un valor por la ventana de la UART hay que enviar los caracteres ASCII que representan un valor, y no el valor en s. Es decir, si queremos mostrar el valor 32, tendremos que convertir este nmero a los caracteres 3 y 2 para proceder a su envo. La conversin puede realizarse utilizando la divisin entera y el mdulo, adems de tener en cuenta que el valor ASCII del carcter 0 es el $30 y que el resto tiene valores consecutivos.
La transmisin debe realizarse mediante interrupciones.
OPCIN: La llamada para la inicializacin de la UART se llevar a cabo mediante un Trap.
Una interrupcin software o Trap es similar a una interrupcin hardware, pero se produce por la ejecucin de una instruccin TRAP. El 68000 dispone de 16 traps distintos, donde cada uno tiene asociado un nmero de vector de interrupcin. Al trap #0 le corresponde el vector $20 (32 , en decimal) y al trap #15, el $2F (47, en decimal).
2. Modificar el programa ECO propuesto en la sesin 2 para que la recepcin de caracteres se realice mediante interrupciones.
Reset: SSP Inicial Reset: PC Inicial Error de Bus Error de Direccin Instruccin Ilegal Divisin por 0 Instruccin CHK Instruccin TRAPV Violacin de Privilegio Traza Emulador Instruccin 1010 Emulador Instruccin 1111 Reservado Vector Int. No Inicializado Reservado Interrupcin Esprea Autovector Nivel 1 Autovector Nivel 2 Autovector Nivel 3 Autovector Nivel 4 Autovector Nivel 5 Autovector Nivel 6 Autovector Nivel 7 Instrucciones TRAP Reservado Vectores de Interrupcin BERR Excepciones Interrupciones Autovectorizadas Direccin RTI Autovectorizadas = N Vector * 4 256 Vectores 1 er Kbyte de memoria Las pastillas de E/S contienen el nmero del vector de interrupcin (8 bits) en el registro del vector de interrupcin
1. Escribir un programa que escriba el eco de lo que se pulsa en el teclado, de tal manera que cuando el carcter pulsado sea un dgito del 1 al 9, la presentacin en pantalla se retardar tantos segundos como indique el dgito pulsado.
La entrada/salida se realizar mediante sondeo (polling).
2. Escribir un programa que simule el comportamiento de un dado. Cada vez que se pulsa una tecla se visualizar un nmero aleatorio entre 1 y 6.
Para obtener el nmero aleatorio podemos utilizar los bits menos significativos del contador del TIMER, habindolo puesto a funcionar previamente. Si dicho contador se decrementa muy rpido (por ejemplo, cada centsima de segundo) y lo leemos cada vez que se pulsa una tecla, podemos considerar este valor como aleatorio. Despus bastar con transformar el valor ledo al rango entre 1 y 6 (mdulo 6 +1). 14
* FICHERO: timer.asm * ============== Saca "*" por la UART 0 cada segundo
TCR_PROG EQU %10100001 * === 101: IRQ Vectorizada, * === 0: ZD activo (Recarga), * === X: No Usado, * === 00: Control de Reloj Modo 00 (Clock Sistema con preescala(32)), * === 1: Activado
MOVE.B #TCR_PROG,TIMER+TCR ; Para activar el TIMER
MOVE.L (SP)+,A0 ; Recupera registro RTS
*==================== Tratamiento de interrupcin del TIMER RTI_TIMER POLL BTST.B #2,UART+USR BEQ POLL MOVE.B #'*',UART+TB
MOVE.B #TCR_PROG,TIMER+TCR ; Para activar el TIMER
RTE
END 16
Ejercicios de la Sesin 6 (DMA)
A continuacin se muestra el esqueleto de un programa que, utilizando el dispositivo DMA, realiza un copia de un bloque de informacin de una zona de memoria a otra.
Se debe completar el programa escribiendo el cdigo necesario en las zonas sombreadas indicadas, y teniendo en cuenta las siguientes consideraciones:
Antes de realizar la copia, la zona origen se rellenar con los 2048 primeros nmeros (0-2047), utilizando una palabra (2 octetos) para almacenar cada nmero. El programa principal, una vez haya inicializado y arrancado el DMA, se quedar en un bucle mostrando repetidamente por la UART A el carcter punto (.) hasta que no finalice la transferencia. La finalizacin de la transferencia se detectar mediante la correspondiente interrupcin y se indicar mostrando el carcter asterisco (*) por la misma UART. El DMA se programar con una velocidad de transferencia de 1 octeto cada 32 ciclos de reloj. La transmisin por la UART A se realizar mediante la tcnica de sondeo (polling).
17
*************************************************** * FICHERO: DMA.asm * Ejemplo de utilizacin del DMA. * Realiza la copia de una zona de memoria ***************************************************
RELLENAR: MOVE.W D0,(A0)+ ADDQ.W #1,D0 ; Utilizar Words para almacenar los nmeros CMP.W #LEN,D0 BNE RELLENAR
MOVE.W #$2300,SR
MOVE.L #ORIGEN,D0 ; Carga en el DMA la direccion de origen
CDIGO PARA ESTABLECER EN EL DMA LA DIRECCIN DEL ORIGEN DEL BLOQUE
MOVE.L #DESTINO,D1 ; Carga la direccion destino
CDIGO PARA ESTABLECER EN EL DMA LA DIRECCIN DEL DESTINO
MOVE.W #LEN*2,D0 ; Carga la longitud de la transferencia en bytes
CDIGO PARA ESTABLECER EN EL DMA EL TAMAO DE LA TRANSFERENCIA.
19
CDIGO PARA ESTABLECER EN EL DMA EL NMERO DEL VECTOR DE INTERRUPCIN QUE SE DEBE GENERAR CON LA INTERRUPCIN.
CDIGO PARA INICIAR LA COPIA DE LA ZONA DE ORIGEN A LA ZONA DE DESTINO.
BUCLE MOVE.B #'.',-(SP) BSR ENV_CAR ; Enva el car. '.' ADDQ.L #2,SP MOVE.B (DMA+DSR),D0 ; Lee el byte de Estado del DMA BTST.B #0,D0 ; Comprueba si an esta copiando BNE BUCLE
BREAK
* * Variables *
ORG $3000 ORIGEN DS.W 1000
ORG $4000 DESTINO DS.W 1000
END 20
Ejercicios de la Sesin 7 (Trabajo Final)
Este ejercicio pretende ser una especie de trabajo final en el que se utilicen conceptos ya introducidos en prcticas anteriores. Por lo tanto, carece de explicaciones tericas y deja al alumno la iniciativa sobre cmo enfocar el problema.
Se plantea la realizacin de lo que denominaremos un medidor de reflejos. Se trata de implementar un bucle sin fin que visualice un estmulo visual al que el usuario deber responder pulsando una tecla cualquiera en el menor tiempo posible. A continuacin se visualizar el tiempo de reaccin (el transcurrido entre la visualizacin del estmulo y la pulsacin de la tecla). El programa utilizar el puerto A de la UART 0 como medio de entrada/salida.
Comenzar visualizando un mensaje para prevenir al usuario, por ejemplo:
Pulse cuando est preparado...
Cuando el usuario lo desee, pulsara una tecla cualquiera. A partir de ese instante transcurrir un tiempo aleatorio (8 0 10 segundos como mximo) al final del cual se visualizar el estmulo, por ejemplo:
..... YA!
A partir de este momento, el usuario pulsar una tecla cualquiera lo antes que pueda y ello dar lugar a la visualizacin del tiempo de reaccin. Este tiempo se medir en centsimas de segundo que es una escala razonable para este tipo de mediciones. El resultado podra ser algo as:
Tiempo de reaccin (centsimas): 68
A continuacin volveramos a repetir el ciclo visualizando nuevamente el mensaje inicial. Nuestro programa no tiene fin.
Se muestra un ejemplo de lo que podra ser la salida de ejecucin a travs del puerto A:
Pulse cuando est preparado... <se pulsa una tecla> ..... YA! Tiempo de reaccin (centsimas): 59
Pulse cuando est preparado... <se pulsa una tecla> ..... YA! Tiempo de reaccin (centsimas): 87