Repository navigation
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
El examen se ha realizado a través de Aula virtual
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:
- Pedir primer numero al usuario
- Si este número es -1, terminar
- Pedir segundo numero al usuario
- Calcular el valor máximo
- Imprimir en la consola el valor máximo
- Llamar a la función print_max() para imprimir el valor máximo formateado
- 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
- 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
retLa 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...
Los scripts de test está disponibles, por si quieres probarlos con tus programas para practicar
- Script de Test: TEST.zip
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.syso.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
- Katia Leal Algara
- Juan González-Gómez (Obijuan)


L1: El simulador RARs
L2: Calculando expresiones
L3: Práctica 1-3. Variables
L4: Pract 2-1. E/S mapeada
L5: Práctica 2-2: Inst. ecall
L6: Prác 2-3: Cadenas
L7: Práct 3-1: Bucles y saltos
L8: Práct 3-2: Cadenas II
L9: Pract 4-1: Subrut. Nivel-1
L10: Pract 4-2: La pila
L11: Pract 4-3: Recursividad
L12: Pract 5-1. Heap. Listas
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 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
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