Skip to content

Examen: Parcial 2:2024_11_21:TELECO

Juan Gonzalez-Gomez edited this page Dec 28, 2024 · 9 revisions

Examen Parcial 2: 2024-11-21. Teleco

  • Tiempo: 50 minutos
  • Descripción: Examen Parcial 2. Laboratorio. Grados de Telecomunicaciones
  • Fecha: 2024/Nov/21
  • Temario: Sesiones L5-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 spacefin.s. TODAS las constantes de los servicios del sistema operativo se deben situar en el fichero ecall.s. El resto de constantes, si se necesitan, se pondrán directamente en el archivo del programa

El programa pide una cadena al usuario, elimina los espacios finales, imprime la cadena resultante dos veces seguidas, imprime un asterisco y termina. En este pantallazo se muestra un ejemplo de funcionamiento. El usuario introduce la cadena "TEST " (con espacios al final), y lo que se imprime es "TESTTEST*" (para verificar que efectivamente los espacios finales se han eliminado). En esta animación se muestra un ejemplo de su funcionamiento:

Animacion FIG

Implementa el programa exclusivamente siguiendo este algoritmo (No te inventes nada. Céntrate en implementar únicamente lo que se indica en este algoritmo). Este algoritmo sólo usa una cadena (NO HAY dos cadenas, una cadena origen y otra destino)

  1. Imprimir mensaje para pedir cadena al usuario
  2. Pedir cadena al usuario
  3. Leer el siguiente caracter de la cadena (Inicialmente se lee el primer carácter)
  4. Si este caracter es '\n', saltar al punto 8
  5. Si este caracter es ' ' saltar al punto 8
  6. Pasar al siguiente caracter
  7. Repetir desde el punto 3
  8. Almacenar el caracter '\0' en la posicion actual de la cadena
  9. Imprimir mensaje para el usuario
  10. Imprimir la cadena original, dos veces (ya no tiene espacios finales)
  11. Imprimir un asterisco ('*')
  12. 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 50 ciclos al procesar la cadena "TEST " (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 al programa

# Programa para eliminar los espacios finales de una cadena

	.include "ecall.s"

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

	.data
	 
#-- Mensajes a mostrar al usuario	 
msg1: .string "Introduce cadena:"
msg2: .string "Cadena sin espacios finales:"

#-- Cadena introducida por el usuario
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  
	
	#-- BONUS: Para que el programa tarde menos ciclos
	#-- asignamos fuera del bucle los valores de 
	#-- los caracteres '\n' y ' '
	li t3, '\n'
	li t2, ' '
	
bucle:
	#-- 3. Leer el caracter actual de la cadena a modificar
	#--  (Inicialmente es el primer caracter de la cadena)
	#-- t1: Caracter
	lb t1, 0(t0)  
	
	#-- 4. Si este caracter es '\n', saltar al punto 8
	#-- ¿Es el caracter \n?
	beq t1, t3, print
	
	#-- 5. Si este caracter es un espacio, saltar al punto 8
	#-- ¿Es un espacio? Si --> terminar
	beq t1,t2,print
	
	#-- 6. Pasar al siguiente caracter
	addi t0,t0,1
	
	#-- 7. Repetir desde el punto 3
	b bucle
	
print:
    #-- 8. Almacenar un \0 en la posicion actual de la cadena
    sb zero, 0(t0)
    
	#-- 9. Imprimir mensaje para el usuario
	la a0, msg2
	li a7, PRINT_STRING
	ecall
	
	#-- 10. Imprimir la cadena dos veces
	la a0, cad
	li a7, PRINT_STRING
	ecall
	ecall
	
	#-- 11. Imprimir un asterisco
	li a0, '*'
	li a7, PRINT_CHAR
	ecall
	
	#-- 12. Terminar
	li a7, EXIT
	ecall

Este programa tarda 49 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. Se quitan puntos según los errores encontrados:

    • Violación de especificaciones: -0.5
    • Programa no ensambla: -0.5
    • Error en tiempo de ejecución al pasar las pruebas: Runtime error: -0.5
    • Retraso en la entrega: -0.5
    • No hay segmento de código: -0.5
    • Variable no contiene el valor correcto: -0.5
    • El programa no termina (-0.5): No se llama al servicio exit del sistema operativo para terminar el programa de forma controlada
  • 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... Se restan puntos por errores encontrados en el código:

    • Código sin sentido (-0.5): Se ha introducido una instrucción, o directiva, que no tiene relación con el enunciado y no se da una explicación explícita de porqué se ha puesto
    • Comentario contradictorio (-0.5): La instrucción hace una cosa, pero en los comentarios se indica otra distinta
    • Comentarios no coherentes (-0.5): Se indica algo en los comentarios que no tiene nada que ver con el código que se está escribiendo
    • Uso de un registro NO inicializado (-0.5)
    • Violacion de especificaciones (-0.5)
    • Dato inventado (-0.5). El código añade algo, o supone algo que no tiene sentido según lo que dice el enunciado
    • No hay comentarios, o son muy escasos (-0.5)

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 ejecutar desde el terminal

Sigue lo siguientes pasos:

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

La estructura queda así:

Parcial2/
├── spacefin.s
├── ecall.s
└── TEST
    ├── test.py
    └── input.txt

Ejecutamos el script test.py:

obijuan@JANEL:~/Parcial2/TEST$ ./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
> ✅️ ../spacefin.s existe
> ✅️ ../ecall.s existe
> Probando: ../spacefin.s
> Ejecutando: java -jar rars1_5.jar nc me ic 10000 dump 0x10010000-0x10010064 HexText data.hex dump .text HexText text.hex ../spacefin.s
> ✅️ data.hex generado
> Instrucciones totales: 32
> ✅️ El programa termina llamando a EXIT
> Ciclos de ejecución: 49
> ✅️ ¡Salida exacta!
  Salida:
  Introduce cadena:Cadena sin espacios finales:TESTTEST*
> Comprobando BONUS...
  > ✅️ Menos de 50 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 spacefin.s y muestra en la salida los resultados

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

Autores

Licencia

Enlaces

Página principal


Sesiones de Prácticas

P1: Simulador RARs

L1: Práctica 1-1. RARs
L2: Práctica 1-2. Ensamblador
L3: Práctica 1-3. Variables

P2: E/S mapeada. Llamadas al sistema

L4: Pract 2-1. E/S mapeada
L5: Práctica 2-2: Inst. ecall
L6: Prác 2-3: Cadenas

P3: Bucles y Saltos condicionales

L7: Práct 3-1: Bucles y saltos
L8: Práct 3-2: Cadenas II

P4: Subrutinas

L9: Pract 4-1: Subrut. Nivel-1
L10: Pract 4-2: La pila
L11: Pract 4-3: Recursividad

P5: Memoria Dinámica

L12: Pract 5-1. Heap. Listas

VÍDEO DE DESPEDIDA

Ejercicios de examen

Simulacro examen 1
GISAM. Ordinario. 2019-Dic-11
GISAM. Extra. 2020-Jul-03
GISAM. Ordinario. 2021-Ene-21
GISAM. Ordinario. 2022-Ene-10
GISAM. Extra. 2022-Jun-29
GISAM. Parcial 1. 2022-Oct-26
GISAM. Parcial 2. 2022-Nov-30
GISAM. Parcial 3. 2022-Dic-21
GISAM. Parcial 1. 2023-Oct-09
GISAM. Parcial 2. 2023-Nov-11
GISAM. Parcial 3. 2023-Dic-20
GISAM. Extra. 2024-Jun-17
GISAM. Parcial 1. 2024-Oct-14
GISAM. Parcial 2. 2024-Nov-13
GISAM. Parcial 3. 2024-Dic-16
TELECO. Ordinario. 2019-Dic-13
TELECO. Extra. 2020-Jul-07
TELECO. Ordinario. 2021-Ene-21
TELECO. Extra. 2021-Jul-02
TELECO. Ordinario. 2022-Ene-10
TELECO. Extra. 2022-Jun-29
TELECO. Ordinario. 2023-Ene-10
TELECO. Extra. 2023-Jun-29
TELECO. Parcial 1. 2023-Oct-20
TELECO. Parcial 2. 2023-Nov-17
TELECO. Parcial 3. 2023-Dic-22
TELECO. Extra. 2024-Jun-17
TELECO. Parcial 1. 2024-Oct-10
TELECO. Parcial 2. 2024-Nov-21
TELECO. Parcial 3. 2024-Dic-19
Robótica. Ordinario. 2020-Jun-1
Robótica. Extra. 2020-Jul-13
Robótica. Ordinario. 2021-Mayo-20
Robótica. Extra. 2021-Junio-16
Robótica. Parcial 1. 2022-Feb-25
Robótica. Parcial 2. 2022-Abril-1
Robótica. Parcial 3. 2022-Mayo-6
Robótica. Parcial 1. 2023-Feb-27
Robótica. Parcial 2. 2023-Mar-27
Robótica. Parcial 3. 2023-May-08
Robótica. Parcial 1. 2024-Feb-26
Robótica. Parcial 2. 2024-Mar-20
Robótica. Parcial 3. 2024-May-06
Robótica. Extra. 2024-Junio-24
Datos. Parcial 1. 2023-Oct-09
Datos. Parcial 2. 2023-Nov-15
Datos. Parcial 3. 2023-Dic-20
Datos. Parcial 1. 2024-Oct-09
Datos. Parcial 2. 2024-Nov-13

SOLUCIONES

Práctica 1: Sesiones 1,2 y 3
Práctica 2: Sesiones 4, 5 y 6
Práctica 3: Sesiones 7 y 8
Práctica 4: Sesiones 9, 10 y 11
Práctica 5: Sesión 12

Clone this wiki locally