Skip to content

Examen: Parcial 3:2024_12_16:GISAM

Juan Gonzalez-Gomez edited this page Dec 17, 2025 · 7 revisions

Examen Parcial 3: 2024-12-16. GISAM

  • Tiempo: 50 minutos
  • Descripción: Examen Parcial 3. Laboratorio. Grado en Ingeniería de Sistemas Audiovisuales y Multimedia
  • Fecha: 2024/Dic/16
  • Temario: Sesiones L9,L10 y L11

Contenido

Enunciado

El examen se ha realizado a través de Aula virtual

Programa (10 ptos)

Escribe un programa en ensamblador para un Riscv para calcular el número máximo entre dos números introducidos por el usuario. Este programa está compuesto por un programa principal y 2 funciones

  • Función max(n1,n2): Esta función calcula el valor máximo entre dos números enteros dados, y lo devuelve. Tiene, por tanto, dos parámetros de entrada y una salida

  • Función print_max(n1,n2,max). Función para imprimir una cadena formateada. Tiene 3 parámetros de entrada, el primer numero, el segundo y su valor máximo. No devuelve ningún valor de salida. La función imprime en la consola la siguiente cadena: "MAX(n1,n2)=max\n", donde n1,n2 y max son los 3 parámetros pasados. NOTA: Esta función NO calcula el valor máximo. Simplemente imprime los 3 parámetros con el formato indicado

El programa principal implementa el siguiente algoritmo:

  1. Pedir primer numero al usuario
  2. Si este número es -1, terminar
  3. Pedir segundo numero al usuario
  4. Calcular el valor máximo
  5. Imprimir en la consola el valor máximo
  6. Llamar a la función print_max() para imprimir el valor máximo formateado
  7. Saltar al paso 1

En esta animación se muestra el funcionamiento:

Se Pide:

a) (3 ptos). Implementa la función max(n1,n2) en el fichero max.s

b) (3 ptos). Implementa la función print_max(n1,n2,max) en el fichero print_max.s

c) (4 ptos). Implementa el programa principal en el fichero main.s

NOTA: Todas las constantes necesarias para los servicios del sistema operativo deberán estar en el fichero so.s

NOTA: Ficheros a entregar:

  • so.s
  • max.s
  • print_max.s
  • main.s

Solución

  • Fichero so.s
#-- Código de los servicios del sistema operativo
#-- Incluir estos archivos en tus programas
#-- para acceder a ellos fácilmente, y hacerlos más
#-- legibles

	.eqv PRINT_STRING 4
	.eqv READ_STRING  8
	.eqv READ_INT     5
	.eqv PRINT_INT    1
	.eqv PRINT_CHAR   11
	.eqv READ_CHAR    12
	.eqv EXIT         10
  • Fichero max.s
#----------------------------------------------------------------
#-- Funcion max(n1, n2): Calcular el valor maximo entre n1 y n2
#-------------------------------
#-- ENTRADAS:
#--    * n1 (a0): Primer numero
#--    * n2 (a1): Segundo numero
#-- SALIDAS:
#--    * Numero maximo (a0)
#----------------------------------------------------------------

	.globl max
	
	.text

max:

	#-- Si n1 > n2, max(n1,n2)=n1
	bgt a0,a1, fin

	#-- n2 >= n1, max(n1,n2)=n2
	mv a0,a1

fin:
	ret
  • Fichero print_max.s
	.include "so.s"
	
#-----------------------------
#-- print_max(n1,n2,max)
#--
#-- Imprimir el mensaje: "MAX(n1, n2)=max"
#--------------------------------------------
#-- ENTRADA:
#--  -n1 (a0): Primer numero
#--  -n2 (a1): Segundo numero
#--  -max (a2): Valor maximo
#-- SALIDA:
#--  -Ninguna
#------------------------------------------------
	.globl print_max
	.data
msg4:   .string "\nMax("
msg5:   .string ", "
msg6:   .string ")= "

	.text
	
print_max:

	#-- Guardar parametros en registros temporales
	mv t0, a0
	mv t1, a1
	mv t2, a2

	#-- Imprimir "Max("
	la a0, msg4
	li a7, PRINT_STRING
	ecall
	
	#-- Imprimir primer numero
	mv a0, t0
	li a7, PRINT_INT
	ecall
	
	#-- Imprimir ", "
	la a0,msg5
	li a7, PRINT_STRING
	ecall
	
	#-- Imprimir segundo numero
	mv a0, t1
	li a7, PRINT_INT
	ecall
	
	#-- Imprimir ")= "
	la a0,msg6
	li a7, PRINT_STRING
	ecall
	
	#-- Imprimir numero maximo
	mv a0, t2
	li a7, PRINT_INT
	ecall
	
	#-- Imprimir \n
	li a0, '\n'
	li a7, PRINT_CHAR
	ecall
	
	#-- Terminar
	ret

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

Los scripts de test está disponibles, por si quieres probarlos 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 Parcial3
  • Pon en ese directorio los ficheros solución del examen: max.s, print_max.s, main.s y so.s. Puedes bajarte los si quieres, para probar max.s, print_max.s, main.s y so.s
  • Descarga el fichero con el escript de test: TEST.zip
  • Cópialo en el directorio Parcial3
  • Descomprímelo

La estructura queda así:

Parcial3/
├── max.s
├── print_max.s
├── main.s
├── so.s
└── TEST
    ├── 01-TEST-max.py
    ├── 02-TEST-print_max.py
    ├── 03-TEST-main.py
    ├── ansi.py
    ├── arquibot.py
    ├── input.txt
    ├── main_TB.s
    ├── max_SOL.s
    ├── max_TB.s
    ├── print_max_SOL.s
    ├── print_max_TB.s
    ├── rars.py
    ├── servicios.s
    ├── so.s
    ├── system.h
    └── test.h

Ejecutamos los scripts python 01-TEST-max.py, 02-TEST-print_max.py y 03-TEST-main.py para probar respectivamente los apartados a, b y c:

obijuan@JANEL:~/Parcial3/TEST$ ./01-TEST-max.py 
══════════════════════════════════════════════════════════════════════
ARQUI-BOT
══════════════════════════════════════════════════════════════════════
TESTING:  ../max.s
───────────────────────────────────
> ❌️ RARS no existe
  > Descargando RARS desde la URL: https://github.com/TheThirdOne/rars/releases/download/v1.5/rars1_5.jar
  > OK!

> ✅️ RARS EXISTE
> ✅️ max_TB.s existe
> ✅️ ../max.s existe
> 🚧 Ejecutando: java -jar rars1_5.jar nc me ic 10000 dump .text HexText text.hex max_TB.s ../max.s
> 🎫 Instrucciones totales: 148
> ✅️ El programa termina llamando a EXIT
> ⏱️  Ciclos de ejecución: 134
> ✅️ ¡Salida exacta!
  Salida:
  Convenio OK!!
OK!!
OK!!
OK!!


> 🧹️ Eliminado text.hex antiguo
──────────────────────────────────────────────────────────────────────
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 prueba el fichero max.s utilizando como programa principal max_TB.s. Este programa principal realiza diferentes llamadas a la función max() para comprobar si funciona correctamente. También se comprueba el convenio de uso de los registros

Este es el resultado de la ejecución del segundo test:

obijuan@JANEL:~/Parcial3/TEST$ ./02-TEST-print_max.py 
══════════════════════════════════════════════════════════════════════
ARQUI-BOT
══════════════════════════════════════════════════════════════════════
TESTING:  ../print_max.s
───────────────────────────────────
> ✅️ RARS EXISTE
> ✅️ print_max_TB.s existe
> ✅️ ../print_max.s existe
> 🚧 Ejecutando: java -jar rars1_5.jar nc me ic 10000 dump .text HexText text.hex print_max_TB.s ../print_max.s
> 🎫 Instrucciones totales: 141
> ✅️ El programa termina llamando a EXIT
> ⏱️  Ciclos de ejecución: 219
> ✅️ ¡Salida exacta!
  Salida:
  
Max(80, 100)= 100
Convenio OK!!

Max(1, 10)= 10

Max(50, 4)= 50

Max(70, 5)= 70


> 🧹️ Eliminado text.hex antiguo
──────────────────────────────────────────────────────────────────────
Pulsa ENTER...

Ahora se prueba el fichero print_max.s, utilizando el programa principal print_max_TB.s. Se hacen diferentes llamadas a la función print_max() y se comprueba automáticamente su salida

Este es el resultado del tercer test:

obijuan@JANEL:~/Parcial3/TEST$ ./03-TEST-main.py 
══════════════════════════════════════════════════════════════════════
ARQUI-BOT
══════════════════════════════════════════════════════════════════════
TESTING:  ../main.s
───────────────────────────────────
> ✅️ RARS EXISTE
> ✅️ ../main.s existe
> ✅️ max_SOL.s existe
> ✅️ print_max_SOL.s existe
> 🚧 Ejecutando: java -jar rars1_5.jar nc me ic 10000 dump .text HexText text.hex ../main.s max_SOL.s print_max_SOL.s
> 🎫 Instrucciones totales: 65
> ✅️ El programa termina llamando a EXIT
> ⏱️  Ciclos de ejecución: 134
> ✅️ ¡Salida exacta!
  Salida:
  
Primer numero : Segundo numero: Valor maximo: 10
Max(1, 10)= 10

Primer numero : Segundo numero: Valor maximo: 50
Max(50, 4)= 50

Primer numero : 

> 🧹️ Eliminado text.hex antiguo
──────────────────────────────────────────────────────────────────────
Pulsa ENTER...

Se comprueba el programa principal main.s, utilizando los ficheros max_SOL.s y print_max_SOL.s que contienen las funciones max() y print_max() respectivamente. Estas funciones cumplen todas las especificaciones y NO violan el convenio de uso de registros

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