Examen: Parcial 2:2023_11_15:Datos - myTeachingURJC/2019-20-LAB-AO GitHub Wiki
Examen Parcial 2: 2023-11-15. Ciencia e Ingeniería de Datos
- Tiempo: 50 minutos
- Descripción: Examen Parcial 1. Laboratorio. Grado de Ciencia e Ingeniería de Datos
- Fecha: 2023/Noviembre/15
- 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 33% del valor de la pregunta
- Solución disponible en Aula virtual
Programa (5 ptos)
Hemos interceptado distintas cadenas de caracteres cifradas en una comunicación. Tras realizar un análisis de frecuencias en dichas cadenas, se ha llegado a la conclusión de que el sistema de cifrado consiste en: sumar al código ascii de cada carácter de la cadena de caracteres un número constante al que llamaremos "clave", es decir, la cadena "abc" cifrada con la clave 1 sería "bcd" (a+1=b, b+1=c, c+1=d), con la clave 3 sería "def" (a+3=d, b+3=e, c+3=f). Para descifrar las cadenas interceptadas, se pide realizar un programa en ensamblador llamado desencriptor.s que implemente el siguiente algoritmo:
-
- Reservar espacio en memoria para dos cadenas de máximo 40 caracteres, una será la cadena de entrada encriptada, y la otra el resultado tras desencriptar.
-
- Pedir la cadena de caracteres a desencriptar y guardar dicha cadena en memoria.
-
- Pedir el valor de la clave (un entero).
-
- Recorrer la cadena empezando por el primer caracter
-
- Si en algún momento se llega al final de la cadena imprimir la cadena desencriptada.
-
- Si no es el final de la cadena, restar al valor ascii del caracter leido el valor de la clave, y almacenar el caracter resultante en la memoria reservada para la cadena desencriptada.
-
- Repetir para el siguiente caracter
Ejemplo de programa:
Introduce cadena: **** user input : Lspe
Introduce Clave: **** user input : 4
Cadena desencriptada: Hola
-- program is finished running (0) --
BONUS (Sólo si lo anterior funciona) Como los caracteres ascii legibles están en el rango de 32 a 126 (en decimal), detectar si, una vez hecha la operación de resta de la clave al carácter, el valor resultante es menor de 32, en tal caso, sumar 95 para que siempre se trabaje con caracteres legibles. Probar el algoritmo para la cadena interceptada X,t!x"3t$&#utw#44 cuya clave es 19.
ENTREGA
Subir TODOS los archivos de código utilizados y necesarios para el funcionamiento.
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 desencriptor.s:
#-- Solución examen parcial 2
#- Programa que pide por teclado una cadena y una clave
#- la desencripta restando el valor de la clave a cada caracter
#- y al terminar la imprime por pantall
.eqv EXIT 10
.eqv READ_INT 5
.eqv PRINT_STRING 4
.eqv READ_STRING 8
.eqv MIN_CHAR 32
.eqv OFFSET 95
.eqv MAX 40
.data
#-- Reserva para las dos cadenas, la encriptada y la desencriptada
str1: .space MAX
str2: .space MAX
msg1: .string "Introduce cadena: "
msg2: .string "Introduce Clave: "
msg3: .string "Cadena desencriptada: "
.text
#-- Imprime por pantalla el mensaje para pedir la cadena
la a0, msg1
li a7, PRINT_STRING
ecall
#-- Pide por teclado una cadena para desencriptar
la a0, str1
li a1, MAX
li a7, READ_STRING
ecall
#-- Imprime por pantalla el mensaje para pedir la clave
la a0, msg2
li a7, PRINT_STRING
ecall
#-- Lectura del valor entero de la clave
li a7, READ_INT
ecall
#-- Movemos ese valor a t6 para no perderlo
mv t6, a0
#-- Carga del caracter \n para detectar el fin de la cadena
li s0, '\n'
#-- Inicialización del puntero a la cadena encriptada
la t0, str1
#-- Inicialización del puntero a la cadena desencriptada
la t1, str2
#-- Carga de los valores necesarios para el BONUS
li t4, MIN_CHAR
bucle:
#-- Lectura del caracter al que apunta el puntero de la cadena encriptada
lb t2, 0(t0)
#-- Si es \n, saltar al final
beq t2, s0, fin
#-- Si no es \n, restar la clave leida
sub t2, t2, t6
#-- BONUS: si el valor tras restar es mayor que 32, saltar la siguiente instrucción
bge t2, t4, salto
#-- BONUS:
addi t2, t2, OFFSET
salto:
#-- Guardamos el valor desencriptado en la posición que apunta el puntero a la cadena desencriptada
sb t2, 0(t1)
#-- Aumentamos en 1 el valor de los dos punteros
addi t0, t0, 1
addi t1, t1, 1
#-- Repetición del bucle
b bucle
fin:
#-- Imprime el mensaje que indica el resultado
la a0, msg3
li a7, PRINT_STRING
ecall
#-- Imprime la cadena desencriptada
la a0, str2
li a7, PRINT_STRING
ecall
#-- FIN
li a7, EXIT
ecall
Autores
- Miguel Ángel de Miguel
- Juan González-Gómez (Obijuan)