FI Practica3 CODE2 FuncionamientoABajoNivelDeUnOrdenador

Fundamentos de Informática Grado en Ingeniería de Tecnologías de Telecomunicación PRÁCTICA 3: FUNCIONAMIENTO A BAJO NIV

Views 98 Downloads 1 File size 1MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Fundamentos de Informática Grado en Ingeniería de Tecnologías de Telecomunicación

PRÁCTICA 3: FUNCIONAMIENTO A BAJO NIVEL DE UN ORDENADOR: CODE-2

Objetivos I.

Comprender el ciclo básico de ejecución de instrucciones de un computador.

II.

Comprender la utilidad de un programa ensamblador.

III.

Familiarizarse con el entorno de programación de CODE-2.

IV.

Ser capaz de escribir un programa de CODE-2 y depurarlo.

Contenido 1. 2. 3. 4. 5. 6.

Introducción ................................................................................................................................................................. 2 Repertorio de instrucciones máquina ............................................................................................................... 2 Panel frontal de CODE-2 .......................................................................................................................................... 4 Utilización del Entorno Integrado (Ensamblador + Simulador + Editor) de CODE-2.................... 5 Requisitos para realizar los ejercicios ............................................................................................................... 9 Ejercicios (a elegir dos) ........................................................................................................................................ 10

Fundamentos de Informática

Página 2 de 12

1. Introducción CODE-2 es una máquina de tipo von Neumann que contiene todas las unidades típicas de este modelo: entradas, salidas, unidad de control, unidad de procesamiento y memoria de datos e instrucciones. CODE-2 es de 16 bits de longitud de palabra y tiene tan sólo 16 instrucciones máquina. A través del lenguaje máquina de CODE-2 tenemos acceso a los siguientes elementos:      

Banco de registros: compuesto por 16 registros (r0 .. rF). Todos son de propósito general, aunque el registro rE se suele utilizar como puntero de pila y rD como registro de dirección. Unidad aritmético lógica (ALU): podremos hacer sumas y restas en C2, la operación NAND y desplazamientos. Biestables indicadores: cero (Z), signo (S), acarreo (C) y desbordamiento (V), según la operación realizada en la ALU. Memoria principal: compuesta por 64Kpalabras de 16 bits (128KB). Puertos de entrada: se pueden usar hasta 256 puertos de entrada (desde el IP00 a IPFF). Puertos de salida: se pueden usar hasta 256 puertos de salida (desde el OP00 a OPFF).

2. Repertorio de instrucciones máquina El repertorio de instrucciones completo se encuentra en la sección 8.3.3 del libro de teoría. En las secciones 8.3.4 y 8.3.5 se pueden encontrar diversos trucos de programación y ejemplos de programas respectivamente. A modo de resumen se incluye aquí la tabla-resumen con las 16 instrucciones, sus parámetros, formato y una explicación de su uso:

Práctica 3: Funcionamiento a Bajo Nivel de un Ordenador: CODE-2

Fundamentos de Informática

Página 3 de 12

ParáForm. metros

Hex

Nombre

Nemónico

0 1

LD ST

rx,[v] [v],rx

F3 F3

LLI

rx,v

F3

LHI

rx,v

F3

rx(15:8)v

4 5 6 7 8

Cargar Almacenar Carga inmediata baja Carga inmediata alta Entrada Salida Suma Resta NAND

IN OUT ADDS SUBS NAND

rx,IPv OPv,rx rx,rs,ra rx,rs,ra rx,rs,ra

F3 F3 F4 F4 F4

9

Desplaz. izqda

SHL

rx

F1

A

Desplaz. dcha

SHR

rx

F1

rxIPv OPvrx rxrs+ra rxrs-ra rx(rs·ra)’ Crx(15), rx(i)rx(i-1), i=15,…,1; rx(0)0 Crx(0), rx(i)rx(i+1), i=0,…,14; rx(15)0

SHRA

rx

F1

Crx(0), rx(i)rx(i+1), i=0,…,14

B-

cnd

F2

Si cnd se cumple, PCrD Si cnd se cumple, rErE-1, M(rE)PC, PCrD PC M(rE); rErE+1 Parar

2 3

C

Desplaz. aritmétic. dcha Salto

D

Subrutina

CALL-

cnd

F2

E F

Retorno Parar

RET HALT

-

F0 F0

B

Explicación

rxM(rD+v) M(rD+v)rx rx(15:8)H’00; rx(7:0)v

Práctica 3: Funcionamiento a Bajo Nivel de un Ordenador: CODE-2

Fundamentos de Informática

Página 4 de 12

3. Panel frontal de CODE-2 La siguiente figura muestra el panel frontal de CODE-2, en el que podemos ver los interruptores de encendido y paso a paso, el teclado hexadecimal con el puerto de entrada IP1 conectado a éste, los dos puertos de salida OP1 y OP2, el registro de instrucción IR, el contador de programa PC, los biestables de la ALU y las teclas/botones de control.

Modos de funcionamiento:  

  

Seleccionar una posición de memoria: tecleamos la dirección cuyo contenido queremos ver y pulsamos la tecla DIRECCIÓN. En OP1 aparece la dirección tecleada y en OP2 su contenido. Si ahora pulsamos CONTINUAR, iremos viendo las siguientes posiciones de memoria. Cargar una información en una posición de memoria: tras seleccionar una posición de memoria, podemos introducir una información por el teclado y pulsar CARGAR para guardar en esa posición de memoria esa información. Automáticamente se incrementa la posición de memoria, de forma que se puede cargar un programa o tabla de datos sin más que ir introduciendo el dato y pulsando en CARGAR. Seleccionar los registros: pulsando en REGISTROS aparece en OP1 el código del registro 0, y en OP2 el contenido. Pulsando a continuación en CONTINUAR podemos ver el resto de registros. Cargar un valor en un registro: una vez que hemos seleccionado un registro, introducimos el valor por el teclado y pulsamos CARGAR. Se memoriza dicho valor en el registro y se pasa a visualizar el siguiente registro. Ejecutar un programa: introducimos por el teclado la dirección de comienzo del programa y pulsamos EJECUTAR. En el caso de estar en modo Paso a Paso, una vez ejecutada la primera instrucción del programa, se irán ejecutando las siguientes instrucciones del mismo cada vez que pulsemos CONTINUAR.

Práctica 3: Funcionamiento a Bajo Nivel de un Ordenador: CODE-2

Fundamentos de Informática

Página 5 de 12

4. Utilización del Entorno Integrado (Ensamblador + Simulador + Editor) de CODE-2 El entorno integrado que nos facilitará el manejo de CODE-2 se puede encontrar en la página web de la asignatura (SWAD). El fichero entorno_CODE2.exe ejecuta el simulador. Es necesario haber descomprimido en el mismo directorio el fichero ensam.exe para que el ensamblador funcione correctamente. No se debe ejecutar directamente el simulador desde el programa compresor. La siguiente figura muestra la pantalla completa del entorno integrado de CODE-2 (entorno_CODE2.EXE), cuando está seleccionada la pestaña Simulador. Como se puede ver, el módulo superior derecho coincide con el panel frontal de CODE-2. El simulador permite la visualización de cualquier registro, puerto de E/S y contenido de memoria de forma mucho más sencilla que a través del panel frontal. Adicionalmente, esta aplicación admite que los programas escritos para CODE-2 sean cargados directamente a partir de un fichero “.EHC” ó “.HEX” evitando que el usuario tenga que teclear directamente cada instrucción.

También se puede ejecutar dicho entorno integrado desde Linux a través de Wine (http://www.winehq.org/). Para ello tecleamos: wine entorno_CODE2.exe.

Práctica 3: Funcionamiento a Bajo Nivel de un Ordenador: CODE-2

Fundamentos de Informática

Página 6 de 12

Ejemplo de uso del Entorno Integrado de CODE-2 Enunciado de un ejercicio de ejemplo: Escriba un programa para CODE-2 que se cargue a partir de la dirección H’000A de memoria cuyo cometido sea sumar el contenido de las posiciones H’0000 y H’0001 de memoria y almacenar el resultado en la posición de memoria H’0002, es decir, M[H’0002] ← M[H’0000]+M[H’0001]. Asimismo, el resultado deberá visualizarse por el puerto de salida OP2. Ejemplo: Si M[H’0000] = H’0B59 y M[H’0001] = H’0004, tras la ejecución del programa M[H’0002] debe contener el valor H’0B5D (ya que H’0B59 + H’0004 = H’0B5D) Primer paso: Escritura del programa en lenguaje ensamblador El entorno integrado de CODE-2 incluye un Editor de textos donde podemos escribir, ensamblar y depurar los errores tipográficos de nuestro programa. Para ello, seleccionamos la pestaña Editor y escribimos nuestro programa en lenguaje ensamblador de CODE-2. Aparte de las instrucciones propias del lenguaje ensamblador de CODE-2, el programa ensamblador ensam.exe (que es el ejecutable al que llama el entorno integrado cuando pulsamos el botón “Ensamblar” del menú del Editor) incorpora dos directivas especiales:  

ORG Dirección: le indica al ensamblador a partir de qué dirección de memoria se van a escribir las instrucciones que se especifican a continuación de dicha directiva, y END: especifica el final del programa.

Además, el programa ensam.exe admite que se añadan comentarios en el propio programa utilizando el carácter “;”. Nada de lo que se escriba en una línea tras el “;” será tenido en cuenta por el programa ensamblador. Para nuestro ejemplo, el programa que debemos escribir debería quedar aproximadamente como se muestra en la siguiente figura, suponiendo que hemos guardado nuestro programa con el nombre U:\prueba1.asm.

Práctica 3: Funcionamiento a Bajo Nivel de un Ordenador: CODE-2

Fundamentos de Informática

Página 7 de 12

Segundo paso: Ensamblado del programa El cometido del programa ensamblador (ensam.exe) es traducir un programa escrito en lenguaje ensamblador de CODE-2 a lenguaje máquina de CODE-2. El entorno integrado de CODE-2 busca el fichero ensam.exe en el mismo directorio donde se encuentra el propio entorno integrado. Si se da esta condición, para ensamblar nuestro programa de ejemplo bastará seleccionar el botón Ensamblar de la Barra de botones del propio entorno integrado. Si no hay errores, nos aparecerá un mensaje indicándonos que el fichero en código máquina de CODE-2 (en nuestro caso de ejemplo u:\prueba1.ehc) ha sido generado. En el caso de haber errores, aparecerá una sub-ventana debajo de nuestro programa enumerando los distintos errores encontrados. Haciendo doble clic en cada mensaje de error, el programa nos posiciona en la línea del programa ensamblador que ha generado dicho error. Los errores más frecuentes que nos podemos encontrar son: Tipográficos: ADS r2,r0,r1 en lugar de ADDS r2,r0,r1 CALL en lugar de CALLR etc. Sintácticos: OUT r4,H’01 en lugar de OUT H’01,r4 LD [rD+H’01],r2 en lugar de LD r2,[rD+H’01] etc. y, sobre todo, no se debe olvidar que conviene siempre especificar AL MENOS una sentencia ORG para indicar al ensamblador a partir de qué dirección de memoria vamos a cargar el programa 1 y recordar que TODOS los programas deben acabar con la directiva END. Como ya se ha indicado, si el proceso de ensamblado se realiza con éxito, se habrá generado un fichero con el mismo nombre pero con extensión “.ehc” (y su equivalente con extensión .hex) que contiene el conjunto de instrucciones en lenguaje máquina. En nuestro caso, el fichero sería u:\prueba1.ehc. Tercer paso: Simulación del programa Para poder simular el programa que hemos escrito, seleccionamos la pestaña Simulador del entorno integrado de CODE-2 (que es la que aparece por defecto al ejecutar el programa por primera vez). Una vez hecho esto, para simular nuestro programa debemos: 1. Encender CODE-2: Botón On/Off del panel frontal. 2. Cargar el programa: Menú Archivo → Cargar programa objeto, y seleccionamos como fichero de entrada u:\prueba1.ehc. 1

Por defecto, si no se especifica ninguna sentencia ORG se comienza a partir de la dirección H’0000 de memoria. Práctica 3: Funcionamiento a Bajo Nivel de un Ordenador: CODE-2

Fundamentos de Informática

Página 8 de 12

3. Introducimos la dirección de inicio por el teclado de CODE-2 (a través del panel frontal) y pulsamos Ejecutar. Con esto, ya habremos ejecutado la primera instrucción del programa. El aspecto en este punto de la simulación es el que se indica en la figura de la página 5¡Error! Marcador no definido.. 4. Si nos encontramos en Modo Paso a Paso (que por defecto está activado), se ejecutarán las siguientes instrucciones del programa cada vez que pulsemos el botón Continuar. Nota 1: Uso de etiquetas en el lenguaje ensamblador de CODE-2 Para facilitar el uso de saltos (condicionales o no) en un programa de CODE-2, el programa ensamblador permite el uso de etiquetas. Para definir una etiqueta basta escribir al principio de una línea el nombre que le queramos poner a dicha etiqueta y acabar dicho nombre con el carácter “:”. Cuando queramos realizar un salto a la instrucción inmediatamente posterior a la localización de dicha etiqueta, tendremos que cargar en RD la dirección de dicho salto. Con el uso de etiquetas, bastará escribir las instrucciones: LLI RD, lo(nombre_etiqueta) LHI RD, hi(nombre_etiqueta) y el programa ensamblador reemplazará durante el proceso de ensamblado “lo(nombre_etiqueta)” por los 8 bits menos significativos de la dirección de salto y “hi(nombre_etiqueta)” por los 8 bits más significativos. Gracias a las directivas “lo” y “hi”, la persona que escribe el programa no tiene que estar recalculando las direcciones de salto cada vez que se inserte una nueva instrucción en el código. A modo de ejemplo, los dos programas siguientes producen exactamente el mismo código CODE-2 cuando se ensamblan: ; Sin usar etiquetas ORG H'0100 LLI r1,H'01 LLI r3,H'F7 LHI R3,H'24 OUT OP1,r3 ADDS r3,r3,r1 LLI rD,H'03 LHI rD,H’01 BR END

;Usando etiquetas ORG H'0100 LLI r1,H'01 LLI r3,H‘F7 LHI r3,H'24 salto: OUT OP1,r3 ADDS r3,r3,r1 LLI RD,lo(salto) LHI RD,hi(salto) BR END

Nota 2: Directiva DATA para la introducción de datos en un programa Normalmente, un programa en CODE-2 actúa sobre ciertos datos guardados en la memoria principal del computador. Con la directiva DATA del lenguaje ensamblador podemos inicializar dichas posiciones de la memoria principal con los valores que queramos. De este modo, cuando carguemos un fichero en el simulador de CODE-2, además de cargar nuestro programa en una determinada zona de la memoria de CODE-2, también podemos inicializar la zona donde están los datos sobre los que

Práctica 3: Funcionamiento a Bajo Nivel de un Ordenador: CODE-2

Fundamentos de Informática

Página 9 de 12

vamos a actuar. A modo de ejemplo, el siguiente programa de CODE-2 es idéntico al que usamos en el ejemplo de esta práctica (el de la suma del contenido de las dos primeras posiciones de la memoria), salvo que además inicializamos las posiciones de memoria M(H’0000) y M(H’0001) con los valores H’0B59 y H’0004, respectivamente. De esta forma, al ejecutar el programa ya sabemos que si ha funcionado bien, la posición de memoria H’0002 debería valer H’0B5D (H’0B59 + H’0004 = H’0B5D), y no tenemos que añadir nosotros manualmente los datos cada vez que carguemos el programa.

5. Requisitos para realizar los ejercicios Para realizar los programas de los ejercicios propuestos al final de este guión, se deberán seguir los siguientes pasos: 1. Describir el algoritmo a implementar por medio de un organigrama o pseudocódigo. 2. Efectuar una asignación de registros y posiciones de memoria para los parámetros y variables utilizadas en el programa. 3. Redactar el programa en nemónicos (lenguaje ensamblador) de CODE-2. 4. Codificar las instrucciones en código máquina (hexadecimal) tanto de forma manual como a través del programa ensamblador. 5. Simular el programa utilizando el programa emulador. 6. Documentar adecuadamente el programa, indicando los pormenores para uso del programa: dirección a partir de la que se debe cargar el programa, datos que solicita el programa durante su ejecución, significado de los resultados de salida, etc.

Práctica 3: Funcionamiento a Bajo Nivel de un Ordenador: CODE-2

Fundamentos de Informática

Página 10 de 12

6. Ejercicios (a elegir dos) AYUDA: el fichero seminarioCODE2.zip contiene el siguiente ejercicio de ejemplo completamente resuelto. Se puede usar como plantilla para el resto de los ejercicios, que son muy similares en cuanto al planteamiento general del problema. EJEMPLO. Tenemos en memoria un conjunto con H’0F datos (una tabla). El primer dato (inicio de la tabla) se encuentra en la posición H’00C0. Hacer un programa que vaya leyendo los datos de la tabla y cuente cuántos números positivos, negativos y ceros hay en el conjunto. Cuando llegue al final, debe mostrar por OP1, primero cuántos números negativos había, a continuación cuántos ceros, y por último cuántos positivos había. Cargar el programa a partir de la posición H’0010. NOTA: Los ficheros .ASM contendrán, además de la implementación de los programas, las directivas DATA para cargar datos de prueba que cubran todos los casos posibles. 1. Tenemos en memoria una tabla desordenada que comienza en la dirección H’0101 y cuyo tamaño viene especificado en la dirección de memoria H’0100. Queremos trasladar aquellos elementos de la tabla que sean pares a una tabla que comience en la dirección de memoria H’0150 y finalmente dar por OP1 el número de elementos transferidos. Cargar el programa a partir de la posición H’0050. 2. Disponemos a partir de la posición H’00B1 de una tabla de calificaciones de D’15 alumnos, cuyas valoraciones van de 0 (H’0000) a 100 (H’0064). Realizar un programa en CODE-2 que copie consecutivamente las calificaciones de los alumnos aprobados a partir de la posición H’00C0. Suponga que la nota de corte para aprobar se proporciona en la posición H’00B0. El programa se debe cargar a partir de la posición H’0000. 3. Tenemos un conjunto de datos con H'12 elementos (una tabla). El primer elemento está en la posición H'00A0. Hacer un programa que vaya leyendo los datos de la tabla y cuente cuántos números están entre el valor 2 y el 8 (mayores que 2 y menores que 8). Tras procesar el último elemento de la tabla, mostrar por OP1 el recuento final. Cargar el programa a partir de la posición H'0000. 4. Tenemos un conjunto de datos con H'07 elementos (una tabla). El primer elemento está en la posición H'0000. Hacer un programa que vaya leyendo los datos de la tabla y los procese de la siguiente forma: si el número leído es menor que 100, que lo sustituya por un 1; si es mayor que 100 y menor que 200, que lo sustituya por un 2; en otro caso, que lo sustituya por un 0. Comprobar que las posiciones de memoria se modifican de acuerdo al algoritmo propuesto. Cargar el programa a partir de la posición H'0A00. 5. Tenemos en memoria una tabla desordenada que contiene H’0A datos. El primer dato (inicio de la tabla) se encuentra en la posición H’00F0. Buscamos un número (que almacenaremos en r2). Si durante la búsqueda se encuentra dicho número, se da su posición dentro de la tabla por OP1. Si no está, se inserta al final de la tabla, y se da su posición dentro de la tabla por OP1. Cargar el programa a partir de la posición H’0000. 6. A partir de la posición de memoria H’0000 tenemos una tabla que contiene D’10 valores enteros de 16 bits sin signo. Escriba un programa para CODE-2 que copie los valores que sean menores

Práctica 3: Funcionamiento a Bajo Nivel de un Ordenador: CODE-2

Fundamentos de Informática

Página 11 de 12

estrictos de H’9000 a partir de la dirección H’0010 de memoria y aquellos que sean mayores o iguales a partir de la dirección H’0020 de memoria. El programa debe comenzar en la dirección H’0100.

¿Qué hay que entregar? Para cada ejercicio elegido:   

Organigrama: realizado con cualquier programa que el estudiante considere apropiado. Tabla de asignación de variables del organigrama a registros de CODE-2. Fichero .ASM: conteniendo la implementación del programa y la inserción de datos de prueba.

Práctica 3: Funcionamiento a Bajo Nivel de un Ordenador: CODE-2