Skip to content

Examen: 2024_06_24:Robótica

Juan Gonzalez-Gomez edited this page Jun 25, 2025 · 1 revision

Examen convocatoria extraordinaria: 2024-06-24. Ingeniería en Robótica Software

  • Tiempo: 2h
  • Descripción: Examen del Laboratorio del grado de Ingeniería en Robótica Software. Convocatoria extraordinaria
  • Fecha: 2024/Junio/24

Contenido

Enunciado

Solución

Como siempre ocurre al programar, existen infinitas soluciones. Pero en todas ellas se debe respetar la especificación y no violar el convenio de uso de registros

  • Fichero dni.asm
#Programa que determina si un DNI español es correcto

	.eqv PRINT_STRING 4
	.eqv READ_STRING 8
	.eqv EXIT 10

#######################################################################################
	.data
msgInicio:	.string "Bienvenidos a comprobador de DNIs"
msgPrompt:	.string "\nDNI: "
msgCorrecto:	.string "CORRECTO\n"
msgError1:	.string "ERROR DE FORMATO\n"
msgError2:	.string "LETRA DE CONTROL INCORRECTA\n"

#**bloque de datos*******************************
 		.eqv MAX_DNI_BUFFER 20
dniBuffer:	.space MAX_DNI_BUFFER 
	
restoLetraControl:
	.string "TRWAGMYFPDXBNJZSQVHLCKE"
#*********************************************
	
#######################################################################################	
	.text
	
	#mensaje de bienvenida
	la a0, msgInicio
	li a7, PRINT_STRING
	ecall			

#**bloque 1 *******************************************
mainLoop:	
	# Prompt:
	la a0, msgPrompt
	li a7, PRINT_STRING
	ecall
	
	# Lee DNI
	la a0, dniBuffer
	li a1, MAX_DNI_BUFFER
	li a7, READ_STRING
	ecall
	
	#Procesar primer caracter
	# Comprueba comando de salida
	lb t0, 0(a0)
	
	li t1, 'q'
	beq t0, t1, mainExit
#*********************************************
	#descomentado (ejercicio 2)
	jal chequeaFormatoDNI
#**bloque 2*******************************************
	bne a0, zero, imprimeFormatoError	
	# Comprueba si letra de control es correcta
	la a0, dniBuffer
#*********************************************
	jal chequeaLetraControlDNI
#**bloque 3*******************************************
	bne a0, zero, imprimeLetraIncorrecta

	la a0, msgCorrecto
	li a7, PRINT_STRING
	ecall	
			
	b mainLoop

imprimeLetraIncorrecta:
	la a0, msgError2
	li a7, PRINT_STRING
	ecall	
	
	b mainLoop

imprimeFormatoError:
	la a0, msgError1
	li a7, PRINT_STRING
	ecall	
	
	b mainLoop

mainExit:
#*********************************************
	#Terminacion del programa		
	li a7, EXIT
	ecall

#######################################################################################	


# Subrutina que chequea si la letra de control de un DNI es correcta (partiendo de un identificador de DNI correctamente formado)
# Entrada
# a0 : Direccion de memoria que apunta a string (cadena de caracteres) que contiene un DNI con formato correcto
# Salida
# a0 = 0 si es correcto, otro valor si error
chequeaLetraControlDNI:

#**bloque 4*******************************************	

	# manejo de pila 
	addi sp, sp, -16
	sw ra, 12(sp) #guarda registro RA
	sw a0, 8(sp) #guarda direccion de memoria de string de entrada

	li t6, 'X'
	li t5, 'Z'
	li t4, '0'
	#transforma primer caracter (X, Y, Z) en digito
	lb t0, 0(a0) #lee caracter
		#comprueba que es X, Y o Z
	blt t0, t6, chequeaLetraControlCambiado
	bgt t0, t5, chequeaLetraControlCambiado
		#transforma primer caracter
	sub t0,t0,t6
	add t0, t0, t4
	sb t0, 0(a0) #modifica string de entrada

chequeaLetraControlCambiado:

#*********************************************	
	jal string8ToInt #transforma string a int
#**bloque 5*******************************************	
	bne a1,zero,chequeaLetraControlError
	
	#a0 contiene el entero
	li t0, 23
	rem t1, a0, t0 # guarda en t1 el resto de la division
	
	#traduce resto a letra
	la t2, restoLetraControl
	add t2, t2,t1
	
	lb t3, 0(t2) #Obtiene letra que corresponde al digito (guarda en t3)
	
	#lee letra de control de string de entrada
	lw t2, 8(sp)
	lb t4, 8(t2) #lee letra de control de string de entrada
	bne t3, t4, chequeaLetraControlError
	li a0, 0
	b chequeaLetraControlFin

chequeaLetraControlError:
	li a0, 1 #error

chequeaLetraControlFin:
 	lw ra, 12(sp)
 	addi sp, sp, 16		
#*********************************************			
	ret

#######################################################################################	

# Si ejercicio 2 se implementa
# Funcion que chequea que un identificador de DNI tiene un formato correcto.
# El primer caracter puede ser un digito (0-9), X, Y o Z
# Del segundo al octavo puede ser un digito (0-9)
# El noveno caracter tiene que ser alfabetico (A-Z)
# Entrada
# a0. String (cadena de caracteres) con el supuesto identificador de DNI
# Salida
# a0 = 0. formato de DNI correcto. Otro valor, formato no correcto.
#
chequeaFormatoDNI:

#**bloque 5*******************************************	
	li t5, '0'
	li t6, '9'
	li t3, 'X'
	li t4, 'Z'
	
	#comprueba primer caracter
	lb t0, 0(a0)
	blt t0,t5,chequeaFormatoDNIError
	bgt t0,t4,chequeaFormatoDNIError
	bge t0,t3,chequeaFormatoDNI_initLoop
	bgt t0,t6,chequeaFormatoDNIError

chequeaFormatoDNI_initLoop:
	addi a0,a0,1 #mueve puntero a siguiente posicion
	
	#comprueba siete digitos siguienes
	li t1,0
	li t2,7 # fin de bucle
chequeaFormatoDNI_7digits:	
	lb t0, 0(a0)
	blt t0,t5,chequeaFormatoDNIError
	bgt t0,t6,chequeaFormatoDNIError

	addi t1, t1, 1
	addi a0, a0, 1
	blt t1,	t2, chequeaFormatoDNI_7digits	
	
	#comprueba letra de control
	li t2, 'A'
	lb t0, 0(a0)
	blt t0, t2, chequeaFormatoDNIError
	bgt t0, t4, chequeaFormatoDNIError

	#comprueba fin de string
	lb t0, 1(a0)
	beq t0,zero, chequeaFormatoDNIError

	li a0,0 #devuelve valor correcto
	b chequeaFormatoDNIFin
	
chequeaFormatoDNIError:
	li a0,1	
chequeaFormatoDNIFin:	
#*********************************************	
	
	ret	

Autores

  • Juan Ignacio Pérez

Licencia

Enlaces

Página principal


Sesiones de Prácticas

P1: Simulador RARs

L1: El simulador RARs
L2: Calculando expresiones
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

SESIONES ADICIONALES

L13: RV32I: Resto de instrucciones
L14: Macros
L15: Entrada/Salida a bajo nivel
L16: Multiplicaciones/divisiones. Unit Tests 🚧
L17: Biblioteca stdio: salida a alto nivel 🚧
Los registros de estado y control (CSR)
Interrupciones y excepciones
Borrador

SOLUCIONES

Soluciones a los ejercicios planteados en cada sesión para practicar:
Sesión L1
Sesión L2
Sesión L3
Sesión L4
Sesión L5
Sesión L6
Sesión L7
Sesión L8
Sesión L9
Sesión L10
Sesión L11
Sesión L12

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
GISAM. Extra. 2025-Jun-17
GISAM. Parcial 1. 2025-Oct-20
GISAM. Parcial 2. 2025-Nov-19
GISAM. Parcial 3. 2026-Enero-9
GISAM. Parcial 1. 2026-Oct-21
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
TELECO. Extra. 2025-Jun-17
TELECO. Parcial 1. 2025-Oct-10
TELECO. Parcial 2. 2025-Nov-13
TELECO. Parcial 3. 2026-Ene-21
TELECO. Extra. 2026-Jun-25
TELECO. Parcial 1. 2026-Oct-09
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
Robótica. Parcial 1. 2025-Feb-25
Robótica. Parcial 2. 2025-Mar-31
Robótica. Parcial 3. 2025-May-19
Robótica. Parcial 1. 2026-Feb-23
Robótica. Parcial 2. 2026-Abr-13
Robótica. Parcial 3. 2026-May-11
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
Datos. Parcial 1. 2025-Oct-15
Datos. Parcial 2. 2025-Nov-19

Clone this wiki locally