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
- Imprimir mensaje para pedir cadena al usuario
- Pedir cadena al usuario
- Leer el caracter actual de la cadena a modificar
- Si este caracter es el de final de cadena ('\0'), saltar al punto 10
- Si este caracter NO es un espacio, saltar al punto 8
- Pasar al siguiente caracter
- Repetir desde el punto 3
- Imprimir mensaje para el usuario
- Imprimir la cadena desde la posicion actual en adelante
- 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
- Script de Test: TEST.zip
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
ysys.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
- Katia Leal Algara
- Juan González-Gómez (Obijuan)