Skip to content

Examen: Parcial 2:2022_04_01:Robótica

Juan Gonzalez-Gomez edited this page Apr 8, 2022 · 9 revisions

Examen Parcial 2: 2022-04-01. Ingeniería en Robótica Software

  • Tiempo: 50 minutos
  • Descripción: Examen Parcial 2. Laboratorio. Grado de Ingeniería en Robótica Software
  • Fecha: 2022/Abril/1
  • 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 para el procesador RV32I, en el fichero cifrar.s. TODAS las constantes necesarias, de cualquier tipo, tienen que estar definidas en el fichero cifrar.s (No puede haber otros ficheros)

El programa deberá pedir al usuario que introduzca una cadena con el texto a cifrar. Este texto se cifrará, y se guardará sobre la propia cadena introducida por el usuario

La cadena introducida por el usuario DEBE estar situada a partir de la primera dirección del segmento de datos

El algoritmo de cifrado utiliza una clave variable, que se incrementa en uno al pasar al siguiente carácter, partiendo de un valor inicial de 1. El algoritmo a implementar es el siguiente:

  1. Inicializar el puntero de cadena (hacia la cadena introducida por el usuario)
  2. Inicializar la clave (valor inicial de 1)
  3. Leer el caracter actual
  4. Si este caracter es '\n', terminar
  5. Sumar la clave al caracter actual
  6. Guardar el carácter cifrado en la posición actual
  7. Incrementar el puntero de cadena
  8. Incrementar la clave en una unidad
  9. Repetir desde el punto 3

En este pantallazo se muestra el funcionamiento

Bonus: Optimización en tiempo

Suponiendo que cada instrucción tarda un ciclo en ejecutarse, obtendrás este bonus si consigues cifrar el texto "Holi" empleando menos de 53 ciclos

NOTA: Envía el fichero cifrar.s con la solución como una entrega del laboratorio

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 cifrar.s:

#-- Programa cifrar.s. Cifrar la cadena introducida por el usuario
#-- utilizando el siguiente algoritmo:
#--
#--  1. Inicializar el puntero de cadena (hacia la cadena introducida
##--    por el usuario)
#--  2. Inicializar la clave (valor inicial de 1)
#--  3. Leer el caracter actual
#--  4. Si este caracter es '\n', terminar
#--  5. Sumar la clave al caracter actual
#--  6. Guardar el carácter cifrado en la posición actual
#--  7. Incrementar el puntero de cadena
#--  8. Incrementar la clave en una unidad
#--  9. Repetir desde el punto 3

 	#-- Constantes del Sistema Operativo 
   #-- usadas. Deben estar en este fichero (POR ESPECIFICACIONES)
   .eqv PRINT_STRING 4
   .eqv READ_STRING  8
   .eqv EXIT         10

   #-- Tamaño maximo cadena introducida por el usuario
   .eqv MAX 20
   
   #-- Clave del cifrado
   .eqv K    1  #-- Valor inicial
   .eqv KINC 1  #-- Incremento de la clave
   		
   .data
   
#-- Cadena introducida por el usuario
#-- ESPECIFICACION: Debe ser la primera
cad:    .space MAX

#-- Resto de mensaje a imprimir
msg1:   .string "Introduce cadena: "
msg2:   .string "Cadena cifrada: "
   
   .text
   
   #-- Imprimir mensaje
   la a0, msg1
   li a7, PRINT_STRING
   ecall
   
   #-- Pedir cadena al usuario
   la a0, cad
   li a1, MAX
   li a7, READ_STRING
   ecall
   
   #-- Cifrar!!!------
   
   #-- 1. Inicializar el puntero de cadena 
   la a0, cad
   
 	#--  2. Inicializar la clave
   li t0, K

 	#-- BONUS OPTIMIZACIÓN:
   #-- En t2 ponemos el carácter \n para detectar el fin 
 	#-- Esta operación la Hacemos FUERA DEL BUCLE
   #-- para que tarde menos
   li t2, '\n'
   
bucle:

	#--  3. Leer el caracter actual
	#--  t1 = Caracter actual
	lb t1, 0(a0)
	
	 #--  4. Si este caracter es '\n', terminar
	beq t1, t2, fin
	
 	#--  5. Sumar la clave al caracter actual
	add t1,t1,t0  #-- t0 = t0 + K
	
	#--  6. Guardar el carácter cifrado en la posición actual
	sb t1, 0(a0)
	
	#--  7. Incrementar el puntero de cadena
	addi a0,a0,1
	
	#--  8. Incrementar la clave 
	addi t0, t0, KINC
	
	#--  9. Repetir desde el punto 3
	b bucle

   #------------------
   
fin:	
   #-- Imprimir el segundo mensaje
   la a0, msg2
   li a7, PRINT_STRING
   ecall
   
   #-- Imprimir la cadena cifrada
   la a0, cad
   li a7, PRINT_STRING
   ecall
   
   #-- Terminar
   li a7, EXIT
   ecall
   

Este programa tarda 52 ciclos, por lo que se cumple el BONUS!. Los ciclos los puedes ver en el registro cycle de la pestaña Control and Status en la parte de la derecha de Rars, al lado de los registros

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. También está disponible un mini-script para bajarse el rars 1.5 desde el repositorio de github

Preparando el entorno

Estos scripts se han hecho para ejecutarse en la bash de LINUX

Sigue lo siguientes pasos:

  • Crea un directorio donde se realizarán las pruebas. Por ejemplo Test
  • Mete en el directorio Test los siguientes ficheros:
    • TEST-01.sh --> Script de test (TEST-01.sh)
    • msg.txt --> Texto con el mensaje a crifrar: msg.txt
    • cifrar.s ---> Tu programa (o puedes bajarte el fichero ya solucionado: cifrar.s
    • get_rars.sh --> (Opcional) Script para descargar el RARs
    • rars1_5.jar --> El simulador RARs

En el mismo directorio de Test necesitas tener el RARs. Si ya lo tienes descargado copialo a Test. 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:~/Test$ bash get_rars.sh 
--2022-03-04 10:18:30--  https://github.com/TheThirdOne/rars/releases/download/v1.5/rars1_5.jar
Resolving github.com (github.com)... 140.82.121.3
Connecting to github.com (github.com)|140.82.121.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
[....]
rars1_5.jar                100%[======================================>]   1,76M  9,79MB/s    in 0,2s    

2022-03-04 10:18:31 (9,79 MB/s) - ‘rars1_5.jar’ saved [1843878/1843878]

obijuan@Hoth:~/Test$ 

Ahora ya tenemos todos los ficheros:

obijuan@Hoth:~/Test$ ls
cifrar.s  get_rars.sh  msg.txt  rars1_5.jar  TEST-01.sh
obijuan@Hoth:~/Test$

Para realizar la prueba hay que ejecutar el script TEST-01.sh:

obijuan@Hoth:~/Test$ bash TEST-01.sh

Esta es la salida:

-----Ejecutando TEST-01-----
> ✅️ rars1_5.jar existe
> ✅️ cifrar.s existe

> ➡️  PROBANDO: cifrar.s
java -jar rars1_5.jar nc me ic dump 0x10010000-0x10010010 HexText mem.hex 10000 dump .text HexText code.hex cifrar.s

> ✅️ mem.hex generado
> ✅️ Primera palabra de memoria: 6d6f7149
> ✅️ Segunda palabra de memoria: 0000000a
> ✅️ El programa termina llamando a EXIT
> Instrucciones totales: 30
> Ciclos de ejecución: 52
> ✅️🎖️  BONUS!!!. Menos de 53 ciclos
> Salida en consola: 
Introduce cadena: Cadena cifrada: Iqom
> ✅️ Salida de consola EXACTA!

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

Al terminar se queda esperando a que apretemos ENTER

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
Datos. Parcial 3. 2025-Ene-17

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