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:
- 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
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
- Script de Test: TEST.zip
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
yso.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
- Katia Leal Algara
- Juan GonzΓ‘lez-GΓ³mez (Obijuan)