Examen: Parcial 3:2024_12_16:GISAM - myTeachingURJC/2019-20-LAB-AO GitHub Wiki

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 datos, 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