Skip to content

Examen: Parcial 3:2022_12_21:GISAM

Juan Gonzalez-Gomez edited this page Dec 13, 2023 · 8 revisions

Examen Parcial 3: 2022-12-21. Ingeniería en Sistemas Audiovisuales y Multimedia

  • Tiempo: 1 hora
  • Descripción: Examen Parcial 3. Laboratorio. Grado de Ingeniería en Robótica Software
  • Fecha: 2022/Diciembre/21
  • Temario: Sesiones L9 y L10

Contenido

Enunciado

El examen se ha realizado a través de Aula virtual. Tiene sólo una parte: un programa

Programa (10 ptos)

Escribe un programa en ensamblador para un Riscv RV32I:

a) (5 ptos) Implementar la función doble(n), que toma el valor entero n y devuelve el doble. Esta función tiene un parámetro de entrada (n) y un valor de retorno (el valor doble). Por ejemplo, la llamada a la función doble(8) nos devolverá el valor 16. Recuerda que el RV32I NO tiene la instrucción de multiplicación (por lo que no la puedes usar). Esta función debe estar implementada en el fichero doble.s

b) (5 ptos) Implementa un programa principal en el fichero main.s. Este programa deberá pedir un número entero al usuario y mostrará en pantalla su valor doble, siguiendo el formato indicado en este pantallazo de ejemplo

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
  • doble.s
  • main.s

Solución al programa

Como siempre ocurre al programar, existen infinitas soluciones. Pero en todas ellas se debe respetar la especificación

Este es el contenido del fichero doble.s:

#----------------------------------------------------------------
#-- Funcion doble(n): Calcula el doble del numero recibido
#-------------------------------
#-- ENTRADAS:
#--    * a0:  Numero a doblar
#-- SALIDAS:
#--    * a0: Numero doble (2 * a0)
#----------------------------------------------------------------

	.globl doble
	
	.text

doble:

	#-- Es una función hoja, por lo que no hay que guardar la direccion
	#-- de retorno en la pila
	add a0, a0, a0

	ret
  • Este es el fichero main.s:
#----------------------------------
#-- Programa principal:
#----------------------------------

	.include "so.s"

	.data

	#-- Mensajes indicados en la ESPECIFICACION
msg1: 	.string "Introduzca un numero entero: "
msg2:   .string "El doble de "
msg3:   .string " es "

	.text
	
	#------ Pedir un numero al usuario
	#-- Imprmir los mensajes pedidos (ESPECIFICACION) 
	la a0, msg1
	li a7, PRINT_STRING
	ecall
	
	#-- Lectura del numero entero (n)
	li a7, READ_INT
	ecall
	
	#-- a0 contiene el numero introducido por el usuario
	#-- Lo guardamos en s0 para no perderlo
	mv s0, a0
	
	#-- Calcular el doble del numero
	jal doble
	
	#-- a0 contiene el doble
	mv s1, a0  #-- Guardar el doble en s1
	
	#-- Imprimir el resultado:
	la a0, msg2
	li a7, PRINT_STRING
	ecall
	
	#-- Imprimir el numero original
	mv a0, s0
	li a7, PRINT_INT
	ecall
	
	#-- Imprimir el mensaje 3
	la a0, msg3
	li a7, PRINT_STRING
	ecall
	
	#-- Imprimir el resultado
	mv a0, s1
	li a7, PRINT_INT
	ecall
	
	
	#-- Terminar
	li a7, EXIT
	ecall 

Todas las constantes utilizadas se deben meter en el fichero so.s (ESPECIFICACIONES):

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

Evaluación

La evaluación de cada apartado 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

La comprobación de las especificaciones se hace mediante programas de test independientes. Cada apartado se prueba de forma independiente. Si por ejemplo en un apartado me piden que implemente una función, esta se prueba contra un programa principal de prueba (NO el proporcionado por el estudiante). Y al revés, si se pide un programa principal, se prueba contra las funciones correctas (no las proporcionadas por el estudiante). Esto permite determiar si la interfaz implementada es al correcta, así como si se ha violado algún convenio

Para ejecutar los scripts de prueba se debe descomprimir el fichero test1.zip en el directorio donde están nuestros programas. La estrucutra de directorios será la siguiente:

Mis programas.s
└── TEST1
   ├── doble_TB.s
   ├── get_rars.sh
   ├── main_TB.s
   ├── msg.txt
   ├── servicios.s
   ├── system.h
   ├── TEST-a.sh   --> Script de prueba del apartado a
   ├── TEST-b-1.sh --> Script de prueba del apartado b
   ├── TEST-b-2.sh --> Prueba del programa del estudiante
   └── test.h

En el mismo directorio de TEST1 necesitas tener el RARs. Si ya lo tienes descargado copialo a TEST1. Si no lo tienes, ejecuta el script de descarga (get_rars.sh). Estos son los ficheros de la carpeta Test:

obijuan@Hoth:~/Test$ ls
calc.s  get_rars.sh  TEST-01.sh

Ejecutamos el script get_rars.sh:

obijuan@Hoth:~/Examen/Programa-1/TEST1
$ bash get_rars.sh

--2023-01-19 12:07:51--  https://github.com/TheThirdOne/rars/releases/download/v1.5/rars1_5.jar
Resolving github.com (github.com)... 140.82.121.4
Connecting to github.com (github.com)|140.82.121.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: [...]
[...]
HTTP request sent, awaiting response... 200 OK
Length: 1843878 (1,8M) [application/octet-stream]
Saving to: ‘rars1_5.jar’

rars1_5.jar         100%[===================>]   1,76M  8,91MB/s    in 0,2s    

2023-01-19 12:07:52 (8,91 MB/s) - ‘rars1_5.jar’ saved [1843878/1843878]

Ficheros a descargar:

Ejemplo

Por ejemplo, supongamos que tenemos los ficheros el programa 1 en la carpeta programa-1. Para comprobar el apartado a ejecutamos este comando:

obijuan@Hoth:~/Examen/Programa-1/TEST1$ bash TEST-a.sh

La salida que aparecerá en la pantalla, si el fichero del apartado a es correcto, será similar a esta:

-----Ejecutando TEST-a-1-----
> ✅️ rars1_5.jar existe
> ✅️ doble.s existe

> ➡️  PROBANDO: doble.s
java -jar rars1_5.jar nc me ic 10000 main_TB.s ../doble.s

> COMPROBANDO VALORES recibidos
> ✅️ doble(8)=16. OK!
> ✅️ Convenio OK!
> ✅️ doble(1)=2. OK!
> ✅️ Convenio OK!
> ✅️ doble(16)=32. OK!
> ✅️ Convenio OK!

> Salida en consola: 
16
Convenio OK!!
2
Convenio OK!!
32
Convenio OK!!
> Ciclos de ejecución: 296
> ✅️ El programa termina llamando a EXIT

------FIN-------

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