Examen: Parcial 2:2023_11_17:TELECO - myTeachingURJC/2019-20-LAB-AO GitHub Wiki
Examen Parcial 2: 2023-11-17. Teleco
- Tiempo: 50 minutos
- Descripción: Examen Parcial 2. Laboratorio. Grados de Telecomunicaciones
- Fecha: 2023/Nov/17
- Temario: Sesiones L5,L6 y L7
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 en ensamblador del RISC-V, en el fichero randhex.s
, para mostrar números aleatorios. Primero se pide al usuario la cantidad de números a mostrar, y a continuación se imprimen los números aleatorios en la consola, en hexadecimal, uno por cada línea. Tras esto el programa termina.
En este pantallazo se muestra la salida del programa cuando el usuario introduce el número 5. Utiliza exactamente las mismas cadenas y saltos de línea (ESPECIFICACIÓN)
Utiliza un servicio del sistema operativo para calcular el número aleatorio (usa el 1 como índice del generador de números pseudoaleatorios)
Utiliza otro servicio del sistema operativo para imprimir los números en hexadecimal
Todas las constantes del sistema operativo deben definirse en el fichero sis.s
Bonus
El número introducido por el usuario se debe almacenar al comienzo del segmento de datos. El programa completo (con los bonus) debe ocupar menos de 24 instrucciones
NOTA: Envía ambos ficheros (randhex.s
y sis.s
), de forma independiente, a través de la entrega de prácticas
Solución al programa
- Fichero:
randhex.s
#-- Programa para imprimir numeros aleatorios en hexadecimal
#-- Servicios del sistema operativo (ESPECIFICACION)
.include "sis.s"
.data
num: .word 0 #-- (BONUS) ESPECIFICACION: Numero introducido por el usuario
msg1: .string "Cantidad de numeros aleatorios: " #-- ESPECIFICACION
.text
#-- Imprimir mensaje
la a0, msg1
li a7, PRINT_STRING
ecall
#-- Pedir cantidad de numeros aleatorios #-- ESPECIFICACION
li a7, READ_INT
ecall
#-- t0: Cantidad de numeros aleatorios
mv t0,a0
#-- BONUS! Guardar este numero al comienzo del segmento de datos
la t1,num
sw t0,0(t1)
#-- Bucle principal
bucle:
#-- Si el numero es 0, terminar
beq t0, zero, fin
#-- Obtener numero aleatorio, llamando al sistema operativo
#-- (ESPECIFICACION)
li a0,1 #---- (ESPECIFICACION: índice del generador de números pseudoaleatorios)
li a7, RAND_INT
ecall
#-- Imprimir numero aleatorio, en hexadecimal (ESPECIFICACION)
li a7, PRINT_INT_HEX
ecall
#-- Imprimir salto de linea (ESPECIFICACION)
li a0, '\n'
li a7, PRINT_CHAR
ecall
#-- Decrementar t0
addi t0,t0,-1
#-- Repetir
b bucle
fin:
#-- Terminar
li a7, EXIT
ecall
El programa tiene 23 Instrucciones en código máquina, por lo que se cumple el Bonus
- Fichero:
sis.s
#-- Código de los servicios del sistema operativo
.eqv PRINT_STRING 4 #-- Impresión de una cadena
.eqv READ_INT 5 #-- Lectura de un número entero
.eqv PRINT_INT 1 #-- Impresión de un número entero
.eqv PRINT_INT_HEX 34 #-- Impresión de un número entero en hexadecimal
.eqv RAND_INT 41 #-- Obtención de un número aleatorio
.eqv PRINT_CHAR 11 #-- Impresión de un carácter
.eqv EXIT 10 #-- Terminar
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:
- Violacion de especificaciones: -0.5
- Programa no ensambla: -0.5
- Error en tiempo de ejecución al pasar las pruebas: Runtime error: -0.5
- ...
-
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
El script de test está disponible, por si quieres probarlo 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 Parcial2
- Pon en ese directorio los ficheros del programa:
randhex.s
ysis.s
, o puedes bajarte los ficheros solucion: randhex.s y sis.s - Descarga el fichero con el escript de test: TEST.zip
- Cópialo en el directorio
Parcial2
- Descomprímelo
La estructura queda así:
Parcial2/
├── randhex.s
├── sis.s
└── TEST
├── test.py
└── input.txt
Ejecutamos el script test.py:
obijuan@Hoth:~/Parcial2/TEST
────────────────────────────────────────
ARQUI-BOT
────────────────────────────────────────
> ❌️ RARS no existe
> Descargando RARS desde la URL: https://github.com/TheThirdOne/rars/releases/download/v1.5/rars1_5.jar
> OK!
> ✅️ RARS EXISTE
> ✅️ ../randhex.s existe
> ✅️ ../sis.s existe
> Probando: ../randhex.s
> Ejecutando: java -jar rars1_5.jar nc me ic 10000 dump 0x10010000-0x10010010 HexText data.hex dump .text HexText text.hex ../randhex.s
> ✅️ data.hex generado
> ✅️ 4 lineas de salida
> ✅️ Mensaje para usuario ok
> Numeros aleatorios:
🔹️0x1D262D4D
🔹️0xF1C9AF9C
🔹️0x5C63FC1D
🔹️0x19A6C99B
> ✅️ El programa termina llamando a EXIT
> Instrucciones totales: 23
> Ciclos de ejecución: 56
> Comprobando BONUS...
> ✅️ Entrada de usuario guardada en memoria
> ✅️ Menos de 24 instrucciones
> 🎖️ BONUS CONSEGUIDO!!!
────────────────────────────────────────
SALIDA programa:
Cantidad de numeros aleatorios: 0x1d262d4d
0xf1c9af9c
0x5c63fc1d
0x19a6c99b
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 analiza el fichero randhex.s
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
- Katia Leal Algara
- Juan González-Gómez (Obijuan)