Examen: Parcial 2:2024_11_13:GISAM - myTeachingURJC/2019-20-LAB-AO GitHub Wiki

Examen Parcial 2: 2024-11-13. GISAM

  • Tiempo: 50 minutos
  • Descripción: Examen Parcial 2. Laboratorio. Grado en Ingeniería de Sistemas Audiovisuales y Multimedia
  • Fecha: 2024/Nov/13
  • Temario: Sesiones L5,L6,L7 y L8

Contenido

Enunciado

El examen se ha realizado a través de Aula virtual. Tiene dos partes: Test y un programa

Test (5 ptos)

  • Realizado a través de Aula virtual
  • 10 preguntas tipo test
  • Las respuesats incorrectas restan un 25% del valor de la pregunta
  • Solución disponible en Aula virtual

Programa (5 ptos)

Escribe un programa para el procesador RV32I, en el fichero spaceini.s. TODAS las constantes de los servicios del sistema operativo se deben situar en el fichero sys.s. El resto de constantes, si se necesitan, se pondrán directamente en el archivo del programa

El programa debe pedir una cadena al usuario, eliminar los espacios iniciales, imprimir el resto de la cadena (sin los espacios iniciales) y terminar. En este pantallazo se muestra un ejemplo de funcionamiento. El usuario introduce la cadena " HOLA", y lo que se imprime es "HOLA"

Implementa el programa mediante el siguiente algoritmo

  1. Imprimir mensaje para pedir cadena al usuario
  2. Pedir cadena al usuario
  3. Leer el caracter actual de la cadena a modificar
  4. Si este caracter es el de final de cadena ('\0'), saltar al punto 10
  5. Si este caracter NO es un espacio, saltar al punto 8
  6. Pasar al siguiente caracter
  7. Repetir desde el punto 3
  8. Imprimir mensaje para el usuario
  9. Imprimir la cadena desde la posicion actual en adelante
  10. Terminar

Bonus: Optimización en tiempo.

Suponiendo que cada instrucción tarda un ciclo en ejecutarse, obtendrás este bonus si consigues que el programa tarde menos de 48 ciclos al procesar la cadena " HOLA" (con 5 espacios). Los ciclos los puedes ver en el registro cycle de la pestaña Control and Status en la parte de la derecha de Rars, al lado de los registros

Solución

# Programa para eliminar los espacios iniciales de una cadena
# e imprimir el resto

	.include "sys.s"

	#-- Longitud maxima de la cadena a introducir
	.eqv MAX 50

	.data
	 
	 #-- Cadena introducida por el usuario
msg1: .string "Introduce cadena:"
msg2: .string "Cadena sin espacios iniciales:"
cad: .space MAX	
	
	
	.text
	
	#-- 1. Imprimir mensaje para pedir cadena al usuario
	la a0, msg1
	li a7, PRINT_STRING
	ecall
	
	#-- 2. Pedir cadena al usuario
	la a0, cad
	li a1, MAX
	li a7, READ_STRING
	ecall
	#-- a0: Puntero a la cadena
	#-- t0: Puntero a la cadena, para no perderlo
	mv t0, a0  
	
	#-- Meter en t2 el caracter ' ' para realizar
	#-- la comparacion
	#-- BONUS: Se coloca fuera del bucle para tardar
	#--  menos ciclos
	li t2, ' '
	
bucle:
	#-- 3. Leer el caracter actual de la cadena a modificar
	#-- t1: Caracter
	lb t1, 0(t0)  
	
	#-- 4. Si este caracter es el de final de cadena ('\0'), saltar al punto 10
	#-- ¿Es el final de la cadena? Si--> Terminar
	beq t1, zero, fin
	
	#-- 5. Si este caracter NO es un espacio, saltar al punto 8
	#-- ¿Es un espacio? NO --> Saltar a imprimir la cadena
	bne t1,t2,print
	
	#-- 6. Pasar al siguiente caracter
	addi t0,t0,1
	
	#-- 7. Repetir desde el punto 3
	b bucle
	
print:
	#-- 8. Imprimir mensaje para el usuario
	la a0, msg2
	li a7, PRINT_STRING
	ecall
	
	#-- 9. Imprimir la cadena desde la posicion actual en adelante
	#-- Usamos el servicio PRINT_STRING
	#-- pasando el puntero actual t0
	mv a0, t0
	li a7, PRINT_STRING
	ecall
	
fin:
	
	#-- 10. Terminar
	li a7, EXIT
	ecall

Este programa tarda 47 ciclos, por lo que se cumple el BONUS!

Evaluación

La evaluación del programa se hace en dos fases:

  • Funcionalidad (2.5 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 (2.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ático

El script de test está disponible, por si quieres probarlo con tus programas para practicar

Preparando el entorno

El script de test se debe ejecutan en la terminal de LINUX

Sigue lo siguientes pasos:

  • Crea un directorio donde se realizarán las pruebas. Por ejemplo Parcial2
  • Pon en ese directorio los ficheros del programa: spaceini.s y sys.s, o puedes bajarte los ficheros solucion: spaceini.s y sys.s
  • Descarga el fichero con el escript de test: TEST.zip
  • Cópialo en el directorio Parcial2
  • Descomprímelo

La estructura queda así:

Parcial2/
├── spaceini.s
├── sys.s
└── TEST
    ├── test.py
    └── input.txt

Ejecutamos el script test.py:

────────────────────────────────────────
ARQUI-BOT
────────────────────────────────────────
> ❌️ RARS no existe
  > Descargando RARS desde la URL: https://github.com/TheThirdOne/rars/releases/download/v1.5/rars1_5.jar
  > OK!

> ✅️ RARS EXISTE
> ✅️ ../spaceini.s existe
> ✅️ ../sys.s existe
> Probando: ../spaceini.s
> Ejecutando: java -jar rars1_5.jar nc me ic 10000 dump 0x10010000-0x10010064 HexText data.hex dump .text HexText text.hex ../spaceini.s
> ✅️ data.hex generado
> Instrucciones totales: 25
> ✅️ El programa termina llamando a EXIT
> Ciclos de ejecución: 47
> ✅️ ¡Salida exacta!
  Salida:
  Introduce cadena:Cadena sin espacios iniciales:HOLA

> Comprobando BONUS...
  > ✅️ Menos de 47 ciclos
  > 🎖️  BONUS CONSEGUIDO!!!
────────────────────────────────────────
Pulsa ENTER...

Primero comprueba si en el directorio está el fichero rars_1.5.jar. Si no es así, se lo baja del repositorio. A continuación analiza el fichero spaceini.s y muestra en la salida los resultados

El script es muy básico, y no detecta toda la casuistica, pero sí permite detectar las violaciones de las ESPECIFICACIONES

Autores

Licencia

Enlaces