Title | Practica 2 en ensamblador |
---|---|
Author | Jor V. Ranipse |
Course | Arquitectura e Ingeniería de Computadores |
Institution | Universidad Rey Juan Carlos |
Pages | 37 |
File Size | 1.6 MB |
File Type | |
Total Downloads | 56 |
Total Views | 147 |
Download Practica 2 en ensamblador PDF
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA
ARQUITECTURA E INGENIERÍA DE COMPUTADORES GRADO EN INGENIERÍA DE SOFTWARE
PRÁCTICAS DE LABORATORIO RUTINAS DE TRATAMIENTO DE EXCEPCIONES E INTERRUPCIONES
CURSO 2017-2018 Luis Rincón Córcoles [email protected] Ángel Serrano Sánchez de León [email protected]
INTRODUCCIÓN En este cuaderno de prácticas de laboratorio se proponen varios ejercicios sobre funciones avanzadas de programación en ensamblador como son: El tratamiento de entrada /salida por pantalla y teclado. El tratamiento de entrada / salida mediante dispositivos hardware simulados. El tratamiento de excepciones internas. El tratamiento de interrupciones externas. Para
realizar
la
práctica
se
utilizará
un
entorno
de
desarrollo
y
simulación de programas en ensamblador para el microprocesador Motorola 68000 llamado EASy68K, que funciona sobre ordenadores con sistema operativo Windows.
La
última
versión
de
este
software
se
encuentra
en
www.easy68k.com.
Hola Mundo en Motorola 68000 (parte guiada) La primera parte de la práctica nos servirá para conocer el entorno del EASy68K. Vamos a ejecutar un Hola Mundo, que es típicamente el primer programa
que
se
escribe
cuando
se
aprende
un
nuevo
lenguaje
de
programación. Su objetivo es simplemente mostrar un mensaje por pantalla (“Hola Mundo”). Abrir el EASy68K encontrarás en
haciendo doble
clic en
el icono
el escritorio, o
bien en
el
menú
del programa que Inicio,
Todos los
programas, carpeta EASy68K.
Para cargar un programa, seleccionar el menú File, opción Open File. Tiene el mismo efecto pulsar Ctrl+O o el icono
. En el cuadro de diálogo que
aparece, seleccionar el programa holamundo.x68.
Prácticas de laboratorio – Entrada / salida en el MC68000
-3-
Una vez cargado el programa, aparecerá el listado en la ventana de trabajo. Ahora vamos a ensamblarlo. Para ello, seleccionar el menú Project, opción Assemble Source. Tiene el mismo efecto pulsar F9 o el icono
.
-4-
Arquitectura e Ingeniería de Computadores
Si todo ha ido bien, aparecerá una ventana como la siguiente, que indica que no hay avisos ni errores de ensamblado. Para ejecutar el programa en el simulador SIM68K, pulsamos el botón Execute.
Aparecerá una nueva ventana con el listado de ensamblado. En cada línea aparecerá la siguiente información: Address:
Dirección
de
memoria
en
la
que
está
almacenada
la
instrucción, expresada en notación hexadecimal (32 bits). Code: Código binario o máquina, expresado en hexadecimal, que ocupa un número de bytes que depende de la instrucción concreta. Line:
Número
de
línea
del
código
fuente
a
título
meramente
informativo. Source: Código fuente en ensamblador.
La próxima instrucción que se va a ejecutar está indicada en color azul. La dirección de dicha instrucción está almacenada en el registro PC (contador de programa).
Prácticas de laboratorio – Entrada / salida en el MC68000
-5-
En la parte superior de la ventana aparecen los registros de datos (D0 – D7), de direcciones (A0 – A7), el registro de estado SR (cuyos 5 bits menos significativos son los códigos de condición XNZVC, que se activan en función de la última operación), el puntero de pila de usuario US y de supervisor SS, además del número estimado de ciclos transcurridos desde el inicio de la simulación. Por defecto EASy68K trabaja en modo supervisor (bit S de la palabra de estado igual a 1), con lo que el puntero de pila SS y el registro A7 (también conocido como SP) coinciden.
Existen varias maneras de ejecutar programas (ver opciones del menú Run): Ejecución normal, para lo cual hay que pulsar el icono
(F9). Al
hacerlo, se ejecutará el programa desde la instrucción indicada por el registro PC hasta que ocurra alguna de las siguientes situaciones: que se llegue al final del programa o a un punto de ruptura, que se pulse el icono de pausa del simulador simulador
(F6) o el de reinicio del
(Ctrl+F2), o bien, que ocurra alguna excepción que
obligue a detener la ejecución.
-6-
Arquitectura e Ingeniería de Computadores
Run To Cursor, o Ejecución hasta el cursor
(Ctrl+F9), que inicia
la ejecución del programa desde la posición actual de PC hasta la instrucción resaltada con el cursor en color azul (salvo que antes se produzca alguna de las situaciones mencionadas antes). Trace Into
(F7), que ejecuta la instrucción actual y sitúa el
contador de programa PC en la siguiente instrucción que se va a ejecutar. En el caso de que se trate de una subrutina (instrucciones JSR o BSR), PC apuntará a la primera instrucción de la subrutina. Step Over
(F8), que ejecuta la instrucción actual y sitúa el
contador de programa PC en la siguiente instrucción que se va a ejecutar. En el caso de que se trate de una subrutina (instrucciones JSR o BSR), esta se ejecutará completamente y PC apuntará a la instrucción que viene después de JSR o BSR. Auto Trace
(F10), que realiza automáticamente un Trace Into en el
programa. El intervalo de tiempo entre dos instrucciones ejecutadas en modo autotraza puede modificarse en el menú Options, opción Auto Trace Options. Por defecto son 200 milisegundos.
Ejecutar el programa del Hola Mundo. Para ver el efecto que produce, seleccionar el menú View, opción Output Window. Aparecerá en la ventana del simulador el siguiente mensaje:
Otras opciones interesantes del menú View son las siguientes: Memory: Muestra el contenido de la memoria. En la columna izquierda aparecen las direcciones y cada línea corresponde a 16 posiciones consecutivas. En el centro de la pantalla aparece el valor de cada uno de los bytes de la memoria, representados en hexadecimal. A la derecha, se muestra el equivalente en código ASCII de 7 bits de cada una de las posiciones, algo que es muy útil cuando los datos almacenados en la memoria son cadenas de caracteres. Mediante las
Prácticas de laboratorio – Entrada / salida en el MC68000
-7-
flechas de la derecha se pueden avanzar o retroceder páginas de la memoria, aunque también podemos hacerlo modificando la dirección que aparece en el cuadro de texto de la esquina superior izquierda. Stack: Muestra el contenido de la pila. A la izquierda se mostrarán las direcciones de memoria y a la derecha el contenido de las cuatro posiciones consecutivas correspondientes, en notación hexadecimal. En color cian aparecerá la posición a la que apunta el puntero de pila en cada momento. Si modificamos el valor del menú desplegable View, podremos ver las direcciones de memoria a las que están apuntando cada uno de los registros de direcciones A0 – A6. Recordad que el registro A7 equivale al puntero de pila de supervisor SS. Por defecto, la pila comienza en la dirección $01000000, aunque esto se puede cambiar modificando el valor del registro A7.
-8-
Arquitectura e Ingeniería de Computadores
Hardware: es un panel que contiene ocho displays de 7 segmentos, ocho ledes, ocho interruptores, ocho pulsadores, un botón de reset y también
permite
habilitar/deshabilitar
interrupciones,
así
como
generarlas periódicamente. Este panel, importante en este cuaderno de prácticas, es descrito en más detalle en el apartado de apéndices.
Prácticas de laboratorio – Entrada / salida en el MC68000
-9-
Por último, para terminar de familiarizarnos con el entorno de trabajo del EASY68K, es muy útil saber cómo insertar en el programa puntos de ruptura (Break Points), en los que la ejecución del programa se detiene. De esta manera, podremos comprobar en un determinado instante el contenido de los registros o de la memoria y ejecutar otras instrucciones menos interesantes sin pausas intermedias. Para añadir un seleccionar el punto verde
punto de ruptura, basta con
que aparece a la izquierda de cada instrucción
en el listado de ensamblado. Al hacerlo, el punto se volverá rojo
. Para
desactivarlo, sólo hay que volver a hacer clic sobre el punto, con lo que recuperará el color verde. Para cualquier otra duda sobre cómo utilizar el EASy68K, os recomendamos visitar la completa ayuda del programa (menú Help, opción Help o pulsar la tecla F1).
Modificación del Hola Mundo (parte no guiada) Se pide modificar el programa Hola Mundo para que salude al usuario de manera personalizada. Para ello, lo primero de todo deberá preguntar el nombre del usuario (que almacenará en una cadena de texto llamada NOMBRE, con capacidad para 16 bytes), así como su edad (variable EDAD de 2 bytes). Este nuevo programa deberá llamarse holamundo2.x68. Fijándonos en el Hola Mundo anterior, vemos que para mostrar un mensaje por la pantalla debemos realizar las siguientes operaciones: Primero debemos hacer que el registro de direcciones A1 almacene la dirección de memoria donde está almacenada la cadena de caracteres que vamos a imprimir. Para ello podemos utilizar la instrucción LEA (Load Effective Address). El registro de datos D0 debe tener el valor decimal 13, que le indica al simulador que vamos a imprimir una cadena de texto (y que, de seguir escribiendo, lo haríamos en la siguiente línea). Se debe lanzar una interrupción con el código 15 con la instrucción TRAP. Para que esto terminar
con
funcione correctamente, la cadena de el
carácter
nulo
(código
ASCII
0).
texto debe Vemos
que
efectivamente lo hemos hecho así, tal y como puede verse en la zona de definición de variables.
-10-
Arquitectura e Ingeniería de Computadores
Nótese que para indicarle al simulador que ha terminado el programa, se debe dar el valor 9 al registro D0 y lanzar la interrupción 15 con TRAP. Sería el equivalente al END en otros lenguajes de programación. Será tarea del alumno consultar el apéndice B de este documento, o bien, la ayuda del programa, sección de Entrada/Salida del simulador (Simulator I/O),
apartado
Text/Time/Terminate,
para
encontrar
los
códigos
de
interrupción que debemos darle a D0 para las siguientes situaciones: Leer una cadena de texto por teclado. Leer un número por teclado. Mostrar por pantalla un número.
Se adjunta una muestra de cuál podría ser el resultado de este programa.
Modificación del Hola Mundo con subrutinas (parte no guiada y opcional) La modificación del Hola Mundo que hemos realizado en el apartado anterior realizaba dos tareas bien diferenciadas. Por un lado, se encargaba de leer por teclado el nombre y la edad del usuario y de almacenar dichos datos en las variables correspondientes. Por otro lado, mostraba el saludo en la pantalla haciendo uso de dichas variables para personalizar el mensaje. Vamos a crear un nuevo programa, llamado holamundo3.x68. Su funcionalidad va a ser la misma que en el apartado anterior. Sin embargo, lo vamos a implementar con dos subrutinas, una encargada de leer por teclado los datos del usuario (LEE_DATOS) y otra encargada de mostrar el saludo personalizado (SALUDA). La especificación de ambas subrutinas es la siguiente:
Prácticas de laboratorio – Entrada / salida en el MC68000
-11-
LEE_DATOS pedirá al usuario que escriba su nombre y su edad. La implementaremos como una subrutina con dos parámetros: o
EDAD (tamaño W), que es un parámetro de salida, que se pasa por copia.
o
NOMBRE (tamaño L), que es un parámetro de entrada/salida que se pasa por referencia, ya que se tratará del puntero a la variable
global
NOMBRE
donde
se
almacenará
el
nombre
del
usuario. SALUDA mostrará en pantalla el saludo correspondiente. Igualmente tiene dos parámetros: o
EDAD (tamaño W), parámetro de entrada que se pasa por copia.
o
NOMBRE (tamaño L), parámetro de entrada, que se pasa por referencia.
Para la correcta encapsulación de las variables, definiremos en el programa principal dos variables globales: NOMBRE (16 bytes) y EDAD (2 bytes). Sin embargo, a diferencia del programa del apartado anterior, no podremos acceder directamente a estas variables en el interior de las subrutinas, sino que deberemos hacerlo a través de los parámetros. Será obligatorio hacer el paso de parámetros por la pila. Las cadenas de texto, así como otros datos complejos (vectores numéricos, matrices, etc.) y los parámetros de entrada/salida, se deben pasar siempre por referencia. En Motorola 68000 existe una instrucción preparada para ello: PEA (Push Effective Address), que carga en la pila una dirección efectiva. Ej.: PEA NOMBRE. Con respecto a los parámetros que se pasan por copia, tenemos varias opciones para meterlos en la pila: Si son parámetros de entrada, utilizaremos la instrucción MOVE con el direccionamiento indirecto al registro SP con predecremento. Ej.: MOVE.W EDAD,–(SP). Si son parámetros de salida, primero deberemos reservar espacio en la
pila,
para
lo
cual
se
puede
usar
la
instrucción
CLR
con
direccionamiento indirecto al registro SP con predecremento. Ej.: CLR.W –(SP). Una vez ejecutada la subrutina, el valor almacenado en la pila deberemos copiarlo en la variable correspondiente con la instrucción MOVE, usando el direccionamiento indirecto al registro SP con postincremento. Ej.: MOVE.W (SP)+,EDAD.
-12-
Arquitectura e Ingeniería de Computadores
En cualquier caso, debemos cerciorarnos de que el puntero de pila SP recupera siempre el valor que tenía antes de introducir los parámetros de la subrutina. Para ello es muy útil sumarle a SP una cantidad igual al número de bytes que ocupan los parámetros mediante la instrucción ADDA. Ej.: ADDA.L #4,SP.
Importante: Para el correcto cálculo de los desplazamientos relativos respecto de SP para acceder a los parámetros dentro de la subrutina, se recomienda dibujar la pila justo antes de ejecutar la instrucción JSR y justo después de entrar en la subrutina. Habrá que indicar claramente los tamaños de los datos almacenados en la pila, así como las direcciones de memoria correspondientes y su contenido. Se recomienda definir los accesos a
cada
parámetro
mediante
la
directiva
EQU
y
usar
el
direccionamiento indirecto al registro SP con desplazamiento.
modo
de
Prácticas de laboratorio – Entrada / salida en el MC68000
Ejercicio 1: Rutinas de tratamiento de interrupciones de E/S
-13-
-14-
En
Arquitectura e Ingeniería de Computadores
este
ejercicio
se
escribirán
diversas
rutinas
de
tratamiento
de
interrupción (RTI). En las RTI se interactuará con la pantalla de E/S, los pulsadores, los LED y/o los displays de 7 segmentos.
Parte 1 El archivo ejercicio1_1.x68 contiene: Un programa principal que se ejecuta durante una serie de ciclos (en principio 5000,
aunque el
alumno
podrá modificar este
valor a
voluntad). Una RTI por cada nivel de interrupción autovectorizado del 1 al 7. Estas
RTI
simplemente
imprimen
por
pantalla
su
número
de
interrupción. Se pide: Analizar el código de las RTI. Ejecutar el programa y observar su funcionamiento.
Parte 2 Ahora se modificarán las RTI para escribir en la ventana de salida el número de veces que se ha atendido cada interrupción. Para cada rutina será preciso crear espacio para una variable con valor inicial 0, variable que se irá incrementando cada vez que salte la rutina. El código resultante se guardará en el fichero ejercicio1_2.x68.
Parte 3 Ahora, además de lo anterior, las RTI iluminarán un led y borrarán los demás. El led iluminado será el correspondiente al nivel de interrupción de la rutina (el led más a la izquierda corresponde al nivel 7), a excepción de la rutina de nivel 7, que iluminará todos los ledes. El código resultante se guardará en el fichero ejercicio1_3.x68.
Parte 4 En este caso, las RTI serán todas iguales a las del paso anterior excepto la de nivel 7, que iluminará los ledes en función de los interruptores que
Prácticas de laboratorio – Entrada / salida en el MC68000
-15-
están justo debajo, de modo que cuando el interruptor i-ésimo esté encendido, también se encenderá el led correspondiente, pero si está apagado, el led no se encenderá. El interruptor más a la izquierda corresponde al nivel 7. El código resultante se guardará en el fichero ejercicio1_4.x68.
Parte 5 En esta parte, las RTI, además de hacer exactamente lo mismo que en la parte anterior, incorporarán una nueva funcionalidad: escribirán en el display de 7 segmentos de su nivel el valor del nivel de interrupción que les corresponde. Los displays del resto de niveles permanecerán apagados mientras se atiende otra interrupción. El display más a la izquierda corresponde al nivel 7, si bien, el simulador lo interpreta como DISPLAY1 (dirección $00E00000). El código resultante se guardará en el fichero ejercicio1_5.x68.
Ejercicio 2: Rutina de tratamiento de una excepción interna
Prácticas de laboratorio – Entrada / salida en el MC68000
-17-
En este ejercicio se proporciona un programa sencillo en ensamblador que pide por teclado que introduzcamos dos enteros, uno de los cuales actuará como dividendo y el otro como divisor. Tras ello, el programa realiza la división y presenta por pantalla el cociente y el resto. El programa se proporciona en el archivo ejercicio2.x68. La tarea del alumno será completar el archivo citado con una rutina de tratamiento de una excepción interna como es la división por 0, que saltará automáticamente en cuanto se realice la división cuando se haya introducido 0 como divisor. Cuando se produzca tal excepción, se dará un mensaje por pantalla indicando su ocurrencia y volviendo a preguntar el divisor. El programa resultante se grabará en el fichero ejercicio2_sol.x68. La siguiente captura de pantalla corresponde a un caso de división correcta: se piden el dividendo y el divisor, se efectúa la división y se presentan los resultados.
En la siguiente captura se muestra un caso de división por cero. Primero se piden los operandos, tras lo cual se realiza la ...