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

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

Licencia

Enlaces