Skip to content

Examen: Parcial 1:2023_11_13:GISAM

Juan Gonzalez-Gomez edited this page Nov 18, 2023 · 3 revisions

Examen Parcial 2: 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

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

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 (random.s y so.s), de forma independiente, a través de la entrega de prácticas

Solución al programa

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
	

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

El script de test está disponible, por si quieres probarlo 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 Parcial2
  • Pon en ese directorio los ficheros del programa: random.s y so.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

Autores

Licencia

Enlaces

Página principal


Sesiones de Prácticas

P1: Simulador RARs

L1: Práctica 1-1. RARs
L2: Práctica 1-2. Ensamblador
L3: Práctica 1-3. Variables

P2: E/S mapeada. Llamadas al sistema

L4: Pract 2-1. E/S mapeada
L5: Práctica 2-2: Inst. ecall
L6: Prác 2-3: Cadenas

P3: Bucles y Saltos condicionales

L7: Práct 3-1: Bucles y saltos
L8: Práct 3-2: Cadenas II

P4: Subrutinas

L9: Pract 4-1: Subrut. Nivel-1
L10: Pract 4-2: La pila
L11: Pract 4-3: Recursividad

P5: Memoria Dinámica

L12: Pract 5-1. Heap. Listas

VÍDEO DE DESPEDIDA

Ejercicios de examen

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

SOLUCIONES

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

Clone this wiki locally