-
Notifications
You must be signed in to change notification settings - Fork 22
Examen: Parcial 1:2023_11_13:GISAM
- Tiempo: 50 minutos
- Descripción: Examen Parcial 2. Laboratorio. Grado en Ingeniería de Sistemas Audiovisuales y Multimedia
- Fecha: 2023/Nov/13
- Temario: Sesiones L5,L6,L7 y L8
El examen se ha realizado a través de Aula virtual. Tiene dos partes: Test y un programa
- 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
Escribe un programa en ensamblador del RISC-V, en el fichero random.s
, para mostrar numeros 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, 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 servicios del sistema operativo para calcular el número aleatorio (usa el 1 como índice del generador de números pseudoaleatorios)
Todas las constantes del sistema operativo deben definirse en el fichero so.s
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 (random.s
y so.s
), de forma independiente, a través de la entrega de prácticas
Este es el programa completo, junto con los bonus
-
Fichero:
random.s
#-- Programa para imprimir numeros aleatorios
#-- Servicios del sistema operativo (ESPECIFICACION)
.include "so.s"
.data
num: .word 0 #-- 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
li a7, RAND_INT
ecall
#-- Imprimir numero aleatorio
li a7, PRINT_INT
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
Este programa tiene 23 instrucciones en código máquina, por lo que se cumple el Bonus
-
Fichero:
so.s
#-- Código de los servicios del sistema operativo
.eqv PRINT_STRING 4 #-- Impresión de cadenas
.eqv READ_INT 5 #-- Lectura de un número entero
.eqv PRINT_INT 1 #-- Impresión de un número entero
.eqv RAND_INT 41 #-- Lectura de un número aleatorio
.eqv PRINT_CHAR 11 #-- Impresión de un carácter
.eqv EXIT 10 #-- Terminar
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...
El script de test está disponible, por si quieres probarlo 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 Parcial2
- Pon en ese directorio los ficheros del programa:
random.s
yso.s
, o puedes bajarte los ficheros solucion: random.s y so.s - Descarga el fichero con el escript de test: TEST.zip
- Cópialo en el directorio
Parcial2
- Descomprímelo
La estructura queda así:
Parcial2/
├── random.s
├── so.s
└── TEST
├── test.py
└── input.txt
Ejecutamos el script test.py:
obijuan@Hoth:~/Parcial2/TEST
$ ./test.py
────────────────────────────────────────
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
> ✅️ ../random.s existe
> ✅️ ../so.s existe
> Probando: ../random.s
> Ejecutando: java -jar rars1_5.jar nc me ic 10000 dump 0x10010000-0x10010010 HexText data.hex dump .text HexText text.hex ../random.s
> ✅️ data.hex generado
> ✅️ 4 lineas de salida
> ✅️ Mensaje para usuario ok
> Numeros aleatorios:
🔹️297187962
🔹️-575808710
🔹️-2010833053
🔹️-1829866429
> ✅️ 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: 297187962
-575808710
-2010833053
-1829866429
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 random.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
- Katia Leal Algara
- Juan González-Gómez (Obijuan)
L1: Práctica 1-1. RARs
L2: Práctica 1-2. Ensamblador
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
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
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
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
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
Práctica 1: Sesiones 1,2 y 3
Práctica 2: Sesiones 4, 5 y 6
Práctica 3: Sesiones 7 y 8
Práctica 4: Sesiones 9, 10 y 11
Práctica 5: Sesión 12