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:

    1. 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.
    1. Pedir la cadena de caracteres a desencriptar y guardar dicha cadena en memoria.
    1. Pedir el valor de la clave (un entero).
    1. Recorrer la cadena empezando por el primer caracter
    1. Si en algún momento se llega al final de la cadena imprimir la cadena desencriptada.
    1. 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.
    1. 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

Licencia

Enlaces