Practica 2 en ensamblador PDF

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 PDF
Total Downloads 56
Total Views 147

Summary

Download Practica 2 en ensamblador PDF


Description

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 ...


Similar Free PDFs