Skip to content

Examen: Parcial 2:2025_11_19:GISAM

Juan Gonzalez-Gomez edited this page Nov 24, 2025 · 2 revisions

Examen Parcial 2: 2025-11-19. GISAM

  • Tiempo: 35 minutos
  • Descripción: Examen Parcial 2. Laboratorio. Grado en Ingeniería de Sistemas Audiovisuales y Multimedia
  • Fecha: 2025/Nov/19
  • 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 sep.s. TODAS las constantes de los servicios del sistema operativo se deben situar en el fichero system.s. El resto de constantes, si se necesitan, se pondrán directamente en el archivo del programa

El programa debe implementar el siguiente algoritmo, punto por punto, que permite separar una cadena en sus caracteres:

  1. Imprimir mensaje en la consola
  2. Pedir palabra al usuario
  3. Imprimir segundo mensaje en la consola
  4. Leer caracter de la cadena
  5. Si el caracter es '*', saltar al punto 11
  6. Si el caractere es '\n', saltar al punto 13
  7. Imprimir caracter actual
  8. Imprimir caracter '-'
  9. Pasar al siguiente caracter
  10. Saltar al punto 4
  11. Imprimir un '*'
  12. Imprimir un salto de linea
  13. Terminar

El programa pide una palabra al usuario, finalizada con el carácter '*'. El algoritmo imprime los caracteres de la cadena separados por el carácter '-'. En este pantallazo se muestra su funcionamiento, así como los mensajes que se deben imprimir en la consola:

Especificaciones adicionales

  • La palabra introducida por el usuario debe tener un máximo de 12 caracteres
  • La cadena que almacena la palabra introducida por el usuario debe estar situada en la primera dirección del segmento de datos

Bonus: Optimizacion en tiempo

Obtendrás este bonus si tienes el programa perfecto (Ningún error en la correccion) y tarda como MAXIMO 64 ciclos en ejecutarse cuando se reproduce el ejemplo de la animación. Puedes comprobar los ciclos en el registro cycle de la pestaña Control and Status en la parte derecha del RARs

Solución al programa

  • Fichero: sep.s
	#-- Servicios del sistema operativo 
	.include "system.s"  # ESPECIFICACION

	#-- Tamaño maximo de la palabra
	.eqv MAX 12   # ESPECIFICACION

	.data
cad:    .space MAX    # Cadena en la primera posicion (ESPECIFICACION)
msg:	.string "Escribe una palabra: "   # ESPECIFICACION
msg2:   .string "Caracteres: "            # ESPECIFICACION

	.text
	
	#-- 1. Imprimir mensaje en la consola
	la a0, msg
	li a7, PRINT_STRING
	ecall
	
	#-- 2. Pedir palabra al usuario
	la a0, cad
	li a1, MAX
	li a7, READ_STRING
	ecall
	
	#-- t0: Puntero a la cadena
	mv t0, a0
	
	#-- 3. Imprimir segundo mensaje en la consola
	la a0, msg2
	li a7, PRINT_STRING
	ecall
	
	#-- BONUS: Sacar los valores constantes
	#-- fuera del bucle para reducir el 
	#-- numero de ciclos
	li t2, '*'
	li t3, '\n'
	
bucle:
	#-- 4. Leer el caracter de la cadena
	lb t1, 0(t0)
	
	#-- 5. Si el caracter es '*', saltar al punto 11
	beq t1, t2, punto11
	
	#-- 6. Si el caractere es '\n', saltar al punto 13
	beq t1, t3, fin
	
	#-- 7. Imprimir caracter actual
	mv a0, t1
	li a7, PRINT_CHAR
	ecall
	
	#-- 8. Imprimir caracter '-'
	li a0, '-'
	ecall
	
	#-- 9. Pasar al siguiente caracter
	addi t0, t0, 1
	
	#-- 10. Saltar al punto 4
	j bucle
	
	
punto11:
	#-- 11. Imprimir un '*'
	li a0, '*'
	li a7, PRINT_CHAR
	ecall
	
	#-- 12. Imprimir un salto de linea
	li a0, '\n'
	ecall
	
fin:
	#-- 13. Terminar
	li a7, EXIT
	ecall
  • Fichero: system.s
    .eqv PRINT_INT    1
    .eqv READ_INT     5
    .eqv PRINT_STRING 4
    .eqv READ_STRING  8
    .eqv PRINT_CHAR   11
    .eqv READ_CHAR    12
    .eqv EXIT         10

Este programa tarda 64 ciclos en ejecutarse, por tanto se comple 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:

    • No hay instrucción sw para escribir en variable (-0.5)
    • Registros inicializados con CONSTANTES cuando el enunciado pide leerlos de memoria (variables) (-0.5)
    • 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
    • Error en calculos (-0.5)
    • No hay comentarios, o son muy escasos (-0.5)

TEST automático

Para comprobar la funcionalidad se utiliza la herramienta Arquibot, que son un conjunto de programas python que ejecutan el simulador RARS en línea de comando y comprueban el funcionamiento correcto del programa en ensamblador entregado por el estudiantado

Para comprobar tu solución sigue estas instrucciones:

  1. Descarga este fichero: arquibot-0.4.zip
  2. Crea un directorio donde se realizarán las pruebas. Por ejemplo Parcial2
  3. Pon en ese directorio el programa realizado. Ficheros sep.s y system.s, o puedes bajarte los ficheros ya solucionados: sep.s, system.s
  4. Descomprime en ese directorio el fichero arquibot-0.4.zip

La estructura queda así:

Parcial2/
├── arquibot-0.4
│   ├── 2025-11-19-P2-run.py
│   └── arquibot
│       ├── ansi.py
│       ├── rars.py
│       └── util.py
├── sep.s
└── system.s

Ejecutamos el script 2025-11-19-P2-run.py:

obijuan@JANEL:~/tmp/Parcial2/arquibot-0.4$ python3 2025-11-19-P2-run.py 
────────────────────────────────────────
ARQUI-BOT 0.4
────────────────────────────────────────
> 🤚 RARS no existe
  > Descargando RARS
  > OK! 

> ☑️  RARS EXISTE
> ✅️ ../sep.s existe
> ✅️ ../system.s existe
> Probando: ../sep.s
> Ejecutando: java -jar rars1_6.jar x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 nc me ic 10000 dump 0x10010000-0x10010100 HexText data.hex dump .text HexText text.hex ../sep.s
> ✅️ Hay segmento de datos
> ✅️ Hay segmento de código
  ──────── Comprobando cadenas
> ✅️ Origen: "test*\n" 
  ──────── Comprobando salida en consola
Escribe una palabra: Caracteres: t-e-s-t-*

> ✅️ ¡Salida exacta!
  ──────── Comprobaciones finales
> ✅️ Se termina con EXIT
> Instrucciones totales: 33
> Ciclos de ejecución: 64
> Comprobando BONUS...
  > ✅️ Máximo de 64 ciclos
  > 🎖️  BONUS CONSEGUIDO!!!
────────────────────────────────────────

obijuan@JANEL:~/tmp/Parcial2/arquibot-0.4$

Este script primero comprueba si en el directorio está el fichero rars_1.6.jar. Si no es así, lo baja del repositorio. A continuación analiza los ficheros del programa 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

Página principal


Sesiones de Prácticas

P1: Simulador RARs

L1: El simulador RARs
L2: Calculando expresiones
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

SESIONES ADICIONALES

L13: RV32I: Resto de instrucciones
L14: Macros
L15: Entrada/Salida a bajo nivel
L16: Multiplicaciones/divisiones. Unit Tests 🚧
L17: Biblioteca stdio: salida a alto nivel 🚧
Los registros de estado y control (CSR)
Interrupciones y excepciones
Borrador

SOLUCIONES

Soluciones a los ejercicios planteados en cada sesión para practicar:
Sesión L1
Sesión L2
Sesión L3
Sesión L4
Sesión L5
Sesión L6
Sesión L7
Sesión L8
Sesión L9
Sesión L10
Sesión L11
Sesión L12

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
GISAM. Extra. 2025-Jun-17
GISAM. Parcial 1. 2025-Oct-20
GISAM. Parcial 2. 2025-Nov-19
GISAM. Parcial 3. 2026-Enero-9
GISAM. Parcial 1. 2026-Oct-21
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
TELECO. Extra. 2025-Jun-17
TELECO. Parcial 1. 2025-Oct-10
TELECO. Parcial 2. 2025-Nov-13
TELECO. Parcial 3. 2026-Ene-21
TELECO. Extra. 2026-Jun-25
TELECO. Parcial 1. 2026-Oct-09
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
Robótica. Parcial 1. 2025-Feb-25
Robótica. Parcial 2. 2025-Mar-31
Robótica. Parcial 3. 2025-May-19
Robótica. Parcial 1. 2026-Feb-23
Robótica. Parcial 2. 2026-Abr-13
Robótica. Parcial 3. 2026-May-11
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
Datos. Parcial 3. 2025-Ene-17
Datos. Parcial 1. 2025-Oct-15
Datos. Parcial 2. 2025-Nov-19

Clone this wiki locally