PRÁCTICAS DE ARQUITECTURA DE COMPUTADORES PRACTICA 7 Repaso del Lenguaje Ensamblador CURSO 2005-2006 Arquitectura de Computadores. Práctica 7: Repaso del lenguaje Ensamblador 1 PRÁCTICA 7 • ASPECTO TRATADO: ¾ Uso de la herramienta de simulación del procesador MIPS R2000. ¾ Programación en ensamblador. ¾ Depuración y ejecución de programas • MATERIAL NECESARIO: ¾ Ordenador con Windows 9X. ¾ Simulador MIPS del disca. ¾ Disquete de 1,44 Kb. Para guardar los datos. ¾ Conjunto de instrucciones MIPS • CONCEPTOS NECESARIOS: ¾ Conocimiento mínimo del Windows 9X. • DESCRIPCIÓN: ¾ Introducción a la programación con ensamblador MIPS. • TIEMPO DE REALIZACIÓN: ¾ 1 sesión de 1,5 horas Arquitectura de Computadores. Práctica 7: Repaso del lenguaje Ensamblador 2 Realización de la práctica. 1. Iniciar Windows 95. - Para entrar en Windows 95 una vez encendido el equipo del aula de informática, realizar las siguientes acciones: - - Encender el ordenador y contestar NO a la pregunta de Re-instalación de Windows98. En caso de que el ordenador no arrancara correctamente se puede re-instalar W98, pero esto puede tardar bastante (10 min.). Cuando aparezca una pantalla de Windows que nos pida nombre de usuario, escribir “usuario” y no introducir ninguna contraseña. Es importante puesto que si no lo hacemos, no podremos acceder a los recursos de la red y realizar todos los ejercicios de la práctica. La segunda vez que nos pida la contraseña, pulsamos Cancelar. 2. Instalación de la aplicación SIMMIPS 2.1. Búsqueda de la aplicación. Para comprobar si el simulador esta ya instalado en el equipo, comprobar si existe en el escritorio el icono con el nombre SIMMPS.EXE. En caso de que exista, arrancar la aplicación para comprobar que efectivamente ya esta instalado. Si el programa se ejecuta correctamente, entonces aparece algo parecido a: Entonces ya está instalado y se puede trabajar con el. En caso contrario, tendréis que instalar la aplicación. Arquitectura de Computadores. Práctica 7: Repaso del lenguaje Ensamblador 3 2.2. Instalación de la aplicación. Para instalar el SIMMIPS debemos buscar un programa .bat que se llama MIPS.bat. Este se encuentra en el servidor Delfos, en el directorio \sys\Apl\Disca (Unidad F). Para buscarlo podéis seguir los siguientes pasos (no son los únicos, existen otras muchas posibilidades): 1. Abrir MiPC (doble click). 2. Abrir F:, que debe de ser una conexión de red que pondrá Apl en \\Delfos\sys. 3. Abrir una carpeta que se llama Disca. 4. Ejecutar el programa MIPS.bat. Una vez hecho esto, el programa se copiara a vuestro disco duro local y se creará un icono en el escritorio para poder arrancarlo. Y una vez finalizado, ya tendremos el programa instalado y podemos arrancarlo con el mismo procedimiento visto en el apartado anterior (icono SIMMIPS). En caso de no tener la conexión de red F: o tenerla a otro sitio, deberéis buscar la carpeta, por ejemplo, a través del icono de red. En caso de que no podáis, no habréis introducido correctamente la contraseña inicial. Deberéis reiniciar la sesión (no es necesario re-arrancar el ordenador). 3. Descripción de la aplicación “simulador gráfico del procesador MIPS R2000”. El programa es un simulador gráfico de un procesador MIPS R2000 desarrollado por Francisco Montero Simarro en un proyecto fin de carrera realizado en la Universidad Politécnica de Valencia, en el departamento del DISCA. Esta inspirado en una versión para Unís de nombre xspim, realizada por James R. Larus en la Universidad de Wisconsin. El simulador permite escribir y ejecutar programas escritos en ensamblador del procesador MIPS R2000. Para conocer el funcionamiento del simulador, estudiaremos las opciones que nos ofrece el menú. Archivo Contiene las funciones típicas en todas las aplicaciones windows y nos permite abrir, guardar, imprimir y editar un nuevo documento de trabajo. El programa trabaja con ficheros de texto que contienen las instrucciones en ensamblador y que usa por defecto la extensión s, aunque no es necesario que sea esta concretamente. Una opción particular de esta aplicación es “Guardar código máquina”, que genera un fichero en el que se puede ver el programa en lenguaje ensamblador y su equivalente en lenguaje máquina. Arquitectura de Computadores. Práctica 7: Repaso del lenguaje Ensamblador 4 Botones nuevo, abrir, guardar y guardar como. Edición Esta opción no contiene ninguna particularidad especial en esta aplicación en concreto. Se puede deshacer la última edición realizada, y las típicas funciones de copiar, cortar y pegar. Botones cortar, copiar, pegar y deshacer. Buscar Al igual que la anterior, solo contiene las funciones clásicas en este menú para buscar y reemplazar texto. Botones buscar y siguiente Ensamblar. Esta opción permite ensamblar los archivos editados. En caso de existir errores de compilación nos mostrará una ventana indicándonos la posición del error. En caso contrario se podrán ejecutar diferentes opciones del programa: • Almacenar código máquina. Botón • Ejecución del programa. bl • añadir puntos de ruptura. • Inicialización de registros. Ejecución. Esta opción permite ejecutar los programas entre las varias opciones de que se dispone y gestionar los puntos de ruptura del programa. • Ejecutar. Esta opción ejecuta el programa sin pausa alguna, a no ser que se hayan especificado puntos de ruptura. Por tanto, de esta forma solo podremos comprobar el correcto funcionamiento del programa en el caso de que hayamos realizado salidas por consola que nos permitan visualizar los resultados. • Ejecución paso a paso. Con esta opción se ejecutan las instrucciones del programa de un en una de forma que se pueden ver en cada momento la evolución de los diferentes elementos del procesador MIPS R2000. • Etapa a etapa. Según el tipo de instrucción de que se trate, su ejecución se divide en diferentes etapas. La ejecución de las instrucciones se puede de esta manera dividir en cada una de las etapas para ver la evolución de la ejecución en la máquina. Estas etapas son: Arquitectura de Computadores. Práctica 7: Repaso del lenguaje Ensamblador 5 BI. Búsqueda de instrucción. DI/BO. Decodificación de la instrucción/búsqueda de operandos. EJ. Ejecución de la instrucción. MEM. Memoria ER. Escritura de los resultados. En cuanto a los puntos de ruptura las opciones de que disponemos son: • Añadir punto de ruptura. Mediante esta opción el programa nos pedirá la etiqueta o dirección donde queremos interrumpir la ejecución de un programa. En los siguientes ejemplos se muestra como introducir puntos de ruptura con etiquetas y con direcciones. • • • Borrar punto de ruptura. Para eliminar el punto de ruptura nos pedirá la etiqueta donde este estaba situado. Borrar todos los puntos de ruptura. En el menú opciones tenemos la posibilidad de borrar todos los puntos de ruptura existentes sin necesidad de especificar las etiquetas. Listar puntos de ruptura. Con esta opción se desplegara una caja de dialogo con las direcciones de las instrucciones donde existen puntos de ruptura. Por ejemplo, si hemos añadido puntos de ruptura en inicio y repeat en el ejemplo anterior, veríamos: Arquitectura de Computadores. Práctica 7: Repaso del lenguaje Ensamblador 6 Notar que en la edición del programa no vemos las direcciones de las instrucciones. Para ello es necesario abrir la ventana memoria. Botones ejecutar, ejecutar paso a paso, ejecutar por etapas y añadir punto de ruptura. Ver. En la ejecución y depuración de un programa podemos estar interesados en visualizar diferentes elementos del sistema. Con esta opción podemos controlar cuando visualizar los siguientes elementos: • Salida. Para ver las salidas por pantalla realizables mediante llamadas al sistema. • Registros de la CPU. En esta ventana podemos ver el contenido de los registros de la CPU y cambiar los valores de los registros modificables con los valores que nos interesen. Para realizar esto, basta con escribir el valor deseado en el registro y pulsar el botón Mod. Reg encargado de registrar en la CPU la modificación realizada de los registros. • Registros del coprocesador 0 CP0. Arquitectura de Computadores. Práctica 7: Repaso del lenguaje Ensamblador 7 • Registros de la FPU. Las instrucciones que operan sobre variables en coma flotante solo pueden usar registros pares. Por tanto, en esta ventana podemos ver el contenido de los registros como de 32 o 64 bits (en el ejemplo f0/f1 y f8/f9). Además, se puede escoger entre • Memoria. • Unidad aritmético-lógica. Arquitectura de Computadores. Práctica 7: Repaso del lenguaje Ensamblador 8 4. Ejercicios. 4.1. Ejemplo 1. Suma de elementos enteros de un vector. Para la realización de este ejercicio contaremos con el fichero sumbyt.s que contiene el programa que podemos ver a continuación con la excepción de no estar comentado. Analiza y ejecuta el programa. .data 0x10000000 vect: .byte 4,5,11,18, 56 #vector de enteros cad: .asciiz "\n La suma de los elementos del vector es :" .text .globl inicio inicio: addi $4, $0, 0 #reset de registro 4 addi $8, $0, 0 #reset de registro 8 addi $9, $0, 0 #reset de registro 9 addi $10, $0, 0 #reset de registro 10 addi $10, $0, 1 #registro 10 contiene decremento nº elementos addi $9, $0, 5 #registro 9 contiene nº de elementos del vector de enteros la $20, vect #registro 20 contiene dirección de los datos repetir:lb $19,0($20) #reg 19 contiene el elemento apuntado por la dirección #almacenada en reg 20 add $8, $8, $19 #se suma el contenido del reg. 8 con el del reg. 19 add $20, $20, 1 #reg. 20 apunta al siguiente elemento del vector (bytes -> +1) sub $9, $9, $10 #se decrementa el nº de elementos pendientes de ejecutar deb1: bne $9, $0, repetir #si aún quedan elementos en el vector se repite el proceso la $4,cad #se imprime la cadena de salida addi $2,$0,4 syscall addi $2, $0, 1 #se imprime el resultado add $4, $0, $8 syscall .end 0x1000..... 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 4 5 11 18 56 1 2 3 4 5 R20 R20 R20 R20 R20 4 5 11 18 56 4 3 2 1 0 4 9 20 Arquitectura de Computadores. 38 94 Direcciones de Memoria Vector iteraciones Dirección donde apunta R20 Contenido de R19 Contenido de R9 (al final de repetir) Contenido de R8 (al final de repetir) Práctica 7: Repaso del lenguaje Ensamblador 9 4.2. Ejercicio 2. Suma de elementos enteros largos de un vector. Para la realización de este ejercicio contaremos con el fichero sumwor.s que contiene un programa con la misma finalidad que el anterior, con la excepción de sumar número enteros largos (word). Para que el programa funcione correctamente es necesario añadir dos instrucciones en la posición indicada (que son modificaciones sobre la instrucción utilizada con los enteros). Completar el programa y el cuadro asociado (para ver los valores en cada iteración hay que introducir puntos de ruptura y consultar los valores de los registros. .data 0x10000000 vect: .word 4,5,11,181, 56 cad:. asciiz "\nLa suma de los elementos del vector es :" .text .globl inicio inicio: addi $4, $0, 0 addi $8, $0, 0 addi $9, $0, 0 addi $10, $0, 0 addi $10, $0, 1 addi $9, $0, 5 la $20, vect repetir: Añadir la instrucción que falta para que el programa funcione correctamente add $8, $8, $19 Añadir la instrucción que falta para que el programa funcione correctamente sub $9, $9, $10 deb1: bne $9, $0, repetir la $4,cad addi $2,$0,4 syscall addi $2, $0, 1 add $4, $0, $8 syscall .end Arquitectura de Computadores. Práctica 7: Repaso del lenguaje Ensamblador 10 4.3. Ejercicio 3. Longitud de una cadena de caracteres Analiza el programa concar.s que realiza la cuenta de la longitud de la cadena “Fundamentos” terminada con carácter nulo \0 situada a partir de la dirección 0x10000000. car: cad: .data 0x10000000 .asciiz "Fundamentos" .asciiz "\n nº de caracteres : " .text .globl inicio inicio: la $20, car addi $21, $0, 0 caracteres bucle: lb $19, 0($20) beq $0, $19, fin addi $20, $20, 1 addi $21, $21, 1 deb1: j bucle # Inicialización del registro 21 para contar los # leer un byte de la cadena # si es el carácter nulo, hemos acabado # sino, apuntar al siguiente caracter # contabilizar el carácter leído. fin: la $4,cad addi $2,$0,4 syscallm # imprimir cadena addi $2, $0, 1 add $4, $0, $21 syscall .end #imprimir nº de caracteres (Tene en cuenta que cada posición de memoria que vemos en la ventana de memoria, representa 4 bytes. Por ejemplo, en este caso, en 0x10000000, tenemos 0x646e7546, que interpretado como ASCII representa “F u n d” - 0x10000000 0x10000001 0x10000002 0x10000003 ) Arquitectura de Computadores. Práctica 7: Repaso del lenguaje Ensamblador 11 4.4. Ejercicio 4. Extracción de datos de un vector. El programa nelem.s, nos devuelve cuantos elementos son mayores, menores e iguales al último elemento de un vector de 32 bits. Los parámetros buscados se ubicaran en memoria. El código no está comentado. .data 0x10000000 vector: .word 34, 21, 10, 5, 3, 10 nelem: .word 6 mayor: .word 0 menor: .word 0 igual: .word 0 .text .globl inicio inicio: lw $20, nelem($0) addi $16,$0,4 mult $20, $16 mflo $16 addi $16, $16, -4 lw $8, vector($16) add $18, $0, $0 bucle:addi $20, $20, -1 lw $21, vector($18) addi $18, $18, 4 Arquitectura de Computadores. si: ent: snsa: igua: finb: slt $7, $21, $8 bne $7, $0, ent j snsa lw $9, menor($0) addi $9, $9,1 sw $9, menor($0) j finb beq $21, $8, igua lw $9, mayor($0) addi $9, $9, 1 sw $9, mayor($0) j finb lw $9, igual($0) addi $9, $9, 1 sw $9, igual($0) beq $20, $0, fin j bucle fin: .end Práctica 7: Repaso del lenguaje Ensamblador 12 4.5. Ejercicio 5. Multiplicacion de vectores. Sean dos vectores de tipo byte de 5 elementos, completar el programa de forma que nos devuelva el producto escalar de los vectores. vect1: vect2: cad: inicio: .data 0x10000000 .byte 4,5,11,18, 56 .data 0x10000008 .byte 10,32,14,13, 21 .asciiz "\ El producto escalar de los vectores es: \n" .text .globl inicio ............................. ............................. Ventana salida El producto escalar de los vectores es: 1764 Arquitectura de Computadores. Práctica 7: Repaso del lenguaje Ensamblador 13