Examen: 2024_06_17:GISAM:TELECO - myTeachingURJC/2019-20-LAB-AO GitHub Wiki
Examen convocatoria extraordinaria: 2024-06-17. GISAM. TELECO
- Tiempo: Una hora y media
- Descripción: Examen final de laboratorio. Grado de ISAM y TELECO
- Fecha: 2024/Junio/17
- Comentarios:
- Acceso a Internet permitido
- Entrega por Aula Virtual
Contenido
Enunciado
El examen se ha realizado a través de Aula virtual. Consta de dos programas
- Ficheros a entregar:
- Del ejercicio 1:
- trunc255.s
- 1_main.s
- Del ejercicio 2:
- rect.s
- Del ejercicio 1:
Bájate el fichero ZIP adjunto, con los ficheros plantilla para hacer el examen
Ejercicio 1 (6 ptos)
Implementar la función trunc255(n) en ensamblador de un RV32I. Esta función trunca un número entero positivo. Si el número n es menor a 255, devuelve el propio número n, pero si es mayor o igual a 255, entonces devuelve 255. Matemáticamente la definimos así:
- trunc255(n):
- Devuelve n si n < 255
- Devuelve 255 en caso contrario
Así, por ejemplo, trunc255(34) = 34 y trunc255(300) = 255
Esta función tiene un argumento de entrada: el número entero (n) y uno de salida: su valor truncado.
Para probar la función utilizamos un programa principal que pide al usuario un número entero, llama a trunc255() con este número para obtener su valor truncado, lo imprime en la consola y repite el proceso. Cuando el usuario introduce el número 0 el programa principal termina
En esta animación se muestra un ejemplo de funcionamiento del programa principal. El usuario calcula los valores truncados de 34 y 300. Por último introduce 0 para terminar
Se pide:
a) (3 ptos) Implementar la función trunc255(n) en el fichero trunc255.s
b) (3 ptos) Implementar el programa principal en el fichero 1_main.s
. Todas las constantes necesarias para acceder a los servicios del sistema operativo deben estar definidas dentro de este fichero
Ejercicio 2 (4 ptos)
Nuestro jefe de proyecto nos ha proporcionado dos funciones y un programa principal, situados en ficheros separados:
- Función linea(n): Dibujar una linea de n asteriscos. Situado en el fichero
linea.s
- Función rect(): Dibujar un rectángulo de 5 líneas de altura. Situado en el fichero
rect.s
- Programa principal: Dibuja dos rectángulos, uno encima de otro. Situado en el fichero
2_main.s
Tanto el programa principal como la función linea() funcionan correctamente. Sin embargo, la función rect() necesita que la modifiquemos para que funcione correctamente
La salida del programa principal, con la función rect() correcta, es la mostrada en esta figura:
Se pide:
- (4 ptos) Modifica la función rect() para que el programa principal funcione correctamente. Sólo puedes añadir código en las zonas indicadas en los comentarios. No puedes modificar el CÓDIGO ORIGINAL
Solución del examen
Solución al programa 1
- Fichero trunc255.s:
#---------------------------------------
#-- Funcion trunc(n)
#-- Truncar el valor positivo n a 255. Se devuelve el siguiente valor:
#-- * n, si n < 255
#-- * 255, si n >= 255
#--
#-- ENTRADA:
#-- a0: (n): Numero positivo a truncar
#-- SALIDA:
#-- a0: trunc255(n): Valor truncado
#--------------------------------------------------
.globl trunc255
.text
trunc255:
#-- Meter en t0 el valor para truncar
li t0, 255
#-- Si el numero es menor a 255...
#-- devolver el mismo numero (no hacer nada)
blt a0, t0, fin
#-- El numero es >= 255: hay que devolver 255
mv a0, t0
#-- Hemos acabado. Devolver lo que haya en a0
fin:
ret
- Fichero 1_main.s
#--------------------------------------
#-- Programa principal
#--
#-- Comprobar el funcionamiento de la
#-- funcion trunc(n)
#----------------------------------------
#-- Servicios del sistema operativo
.eqv PRINT_STRING 4
.eqv READ_INT 5
.eqv PRINT_INT 1
.eqv EXIT 10
.data
msg1: .string "\nIntroduce numero: "
msg2: .string "Valor truncado: "
.text
bucle:
#-- Imprimir mensaje
la a0, msg1
li a7, PRINT_STRING
ecall
#-- Pedir entero al usuario
li a7, READ_INT
ecall
#-- Si el numero introducido es 0 terminamos
beq a0, zero, fin
#-- Calcular valor truncado
jal trunc255
#-- a0 contiene el valor truncado
mv t0, a0
#-- Imprimir mensaje 2
la a0, msg2
li a7, PRINT_STRING
ecall
#-- Imprimir el valor truncado
mv a0,t0
li a7, PRINT_INT
ecall
#-- Repetir
b bucle
fin:
#-- Terminar
li a7, EXIT
ecall
Solución al programa 2
- Fichero rect.s:
#-----------------------------------------------------------
#-- rect: Dibujar un rectangulo de 5 lineas
#--
#-- ENTRADAS:
#-- Ninguna
#-- SALIDA:
#-- Ninguna
#----------------------------------------------------------
.globl rect
.eqv MAX 5 #-- Lineas del rectangulo
.eqv WIDTH 20 #-- Anchura del rectangulo
.text
rect:
#-- Añade aquí lo que consideres necesario
#-- Reservar espacio para la pila
addi sp,sp,-16
#-- Guardar la direccion de retorno
sw ra, 12(sp)
#-- Guardar el registro s0 en la pila para
#-- respetar el convenio de uso de registros
sw s0, 0(sp)
#---------------------------------------
#-- CODIGO ORIGINAL: NO CAMBIAR NADA
#--------------------------------------
#-- Inicializar contador de lineas
li s0,1
bucle:
#-- Dibujar linea de WIDTH caracteres
li a0, WIDTH
jal linea
#-- Incrementar contador de linea
addi s0,s0,1
#-- Si hemos completado la cantidad de lineas: terminar
li t0,MAX
ble s0,t0,bucle
#-- Fin.... Hemos terminado
#--------------------------
#-- FIN DEL CODIGO ORIGINAL
#-------------------------
#-- Añade aqui lo que consideres necesario
#-- Recuperar s0
lw s0, 0(sp)
#-- Recuperar la direccion de retorno
lw ra, 12(sp)
#-- Liberar la pila
addi sp,sp,16
ret
- Fichero 2_main.s:
#--------------------------
#-- Programa principal
#-- Imprimir dos rectangulos de asteriscos
#-- en la consola
#--------------------------
.include "so.s"
.text
#-- Dibujar un rectangulo
jal rect
#-- Salto de linea
li a0, '\n'
li a7, PRINT_CHAR
ecall
#-- Salto de linea
li a0, '\n'
li a7, PRINT_CHAR
ecall
#-- Dibujar otro rectangulo
jal rect
fin:
#-- Terminar
li a7, EXIT
ecall
Evaluación
La evaluación de cada apartado (2.5 ptos) de un programa se hace en dos fases:
-
Funcionalidad (1 ptos): Se comprueba si el programa funciona, y si cumple con las especificaciones (Nombre del fichero correcto, ensablado sin errores, sin errores en tiempo de ejecución, resultado correcto, variables definidas en sus posiciones de memoria especificadas, etc). Esto se hace mediante un script de test, que automatiza el proceso
-
Código (1.5 ptos): Se inspecciona visualmente cómo está hecho el código: código limpio, claro, con comentarios, instrucciones correctas, fallos de programación, etc...
TEST automáticos
La comprobación de las especificaciones se hace mediante programas de test independientes. Cada apartado se prueba de forma independiente. Si por ejemplo en un apartado me piden que implemente una función, esta se prueba contra un programa principal de prueba (NO el proporcionado por el estudiante). Y al revés, si se pide un programa principal, se prueba contra las funciones correctas (no las proporcionadas por el estudiante). Esto permite determiar si la interfaz implementada es al correcta, así como si se ha violado algún convenio
Para hacer ejecutar los scripts de prueba se deben descomprimir los ficheros test1.zip y test2.zip en el directorio donde están nuestros programas. La estrucutra de directorios será la siguiente:
> Mis programas.s
+-- TEST1
| +-- Scripts de prueba para problema 1
+-- TEST2
+-- Scripts de prueba para problema 2
Ficheros a descargar:
Ejemplo
Por ejemplo, supongamos que tenemos los ficheros el programa 1 en la carpeta programa-1
. Para comprobar el apartado a ejecutamos este comando:
obijuan@Hoth:~/Programa-1/TEST1
$ ./test-1-a.py
La salida que aparecerá en la pantalla, si el fichero del apartado a es correcto, será similar a esta:
obijuan@Hoth:~/Programa-1/TEST1
$ ./test-1-a.py
────────────────────────────────────────
ARQUI-BOT
────────────────────────────────────────
> ✅️ RARS EXISTE
> ✅️ trunc255_TB.s existe
> Probando: trunc255_TB.s
> Ejecutando: java -jar rars1_5.jar x10 nc me ic 10000 dump .text HexText text.hex trunc255_TB.s ../trunc255.s
> ✅️ Convenio OK!
> ✅️ TRUNC255(5)=5
> ✅️ TRUNC(300)=255
> ✅️ TRUNC255(250)=250
> ✅️ El programa termina llamando a EXIT
> Instrucciones totales: 148
> Ciclos de ejecución: 136
────────────────────────────────────────
SALIDA programa:
Convenio OK!!
OK!!
OK!!
OK!!
Pulsa ENTER...
Autores
- Katia Leal Algara
- Juan González-Gómez (Obijuan)