Examen: Parcial 1:2025_03_31:Robotica - myTeachingURJC/2019-20-LAB-AO GitHub Wiki
Examen Parcial 2: 2025-03-31. Robotica
- Tiempo: 50 minutos
- Descripción: Examen Parcial 2. Laboratorio. Grado en Ingeniería de Robótica Software
- Fecha: 2025/Marzo/31
- 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)
Una función muy utilizada en la automatización de comunicaciones masivas es la que reemplaza una marca en una plantilla genérica por el nombre real del destinatario con el objeto de personalizarlo. Este tipo de funciones son ofrecidas por la mayoría de los procesadores de texto, clientes de correo electrónico, etc.
El programa requerido en este ejercicio es una versión simplificada de la automatización de automatizaciones masivas. Partiendo de una cadena de texto definida en el segmento de datos que incluya la secuencia "n", y que podría tener el siguiente contenido:
"Estimado n:\nBienvenido al examen de Arquitectura de Computadores"
Se ha de requerir al usuario final que inserte un nombre por consola (máximo 20 caracteres), y sobre la cadena anterior se ha de reemplazar la secuencia "n" por el nombre introducido por el usuario final y finalmente ha de mostrarse por pantalla
Ejemplo de ejecución:
Consideraciones adicionales. Puede asumir que la cadena de texto a transformar no va a tener nunca más de 100 caracteres. Valor ASCII de:
'*' 42
'n' 110
NOTA: Se ha de entregar el programa en un fichero llamado: "replace.s" Si se utiliza algún fichero auxiliar con definiciones, ha de ser entregado.
Solución al programa
Asume existencia de fichero servicios.asm con las definiciones de las llamadas al sistema (syscalls) de RISC-V
#-- Constantes del Sistema operativo
.include "servicios.asm"
#-- Longitud maxima del nombre
.eqv LONGITUD_NOMBRE 21
#-- Caracteres ascii
.eqv ASTERISCO 42 #'*'
.eqv N_MINUS 110 #'n'
.data
nombre: .string "Introduzca el nombre: "
template: .string "Estimado *n*:\nBienvenido al examen de Arquitectura de Computadores"
input_name: .space 21 #-- Almacenamiento del nombre
salida: .space 121 #-- Cadena final de salida
.text
# Imprimir mensaje para pedir nombre
li a7, PRINT_STRING
la a0, nombre
ecall
# leer de consola el nombre y guardar nombre en input_name
li a7, READ_STRING
la a0, input_name
li a1, LONGITUD_NOMBRE
ecall
# recorrer template hasta *n* y copiar en cadena de salida
la t0,template
la t5, salida
bucle1:
#-- Leer caracter del template
lb t1, 0(t0)
#-- chequea si es secuencia a reemplazar
#-- Caracteres de la secuencia a comprobar
li t2, ASTERISCO
li t3, N_MINUS
#-- No es el asterisco inicial
bne t1,t2,no_secuencia
lb t4,1(t0)
#-- No es el menos
bne t4,t3,no_secuencia
lb t4,2(t0)
#-- No es el asterisco final
bne t4, t2, no_secuencia
#-- Secuencia detectada!
b secuencia
no_secuencia:
#-- Secuancia NO detectada:
#-- copia caracter leido en cadena de salida
sb t1,0(t5)
#-- Apuntar a los siguientes caracteres en las
#-- cadenas de template y salida
addi t0, t0,1
addi t5, t5,1
#-- Repetir
b bucle1
#-- Secuencia detectada: Copiar nombre en la
#-- cadena de salida
secuencia:
# t0 apunta a la primera posición de la secuencia, mejor no tocarlo
#-- t2: Puntero al nombre
la t2, input_name
bucle2:
#-- Leer primer caracter del nombre
lb t3, 0(t2)
#-- Si el caracter es 0, el nombre ya se ha compiado
beq t3,zero,nombre_copiado
#-- Si el caractere es \n, el nombre ya se ha copiado
li t4, '\n'
beq t3, t4, nombre_copiado
#-- Copiar el caracter
sb t3, 0(t5)
#-- Apuntar al siguiente caracter del nombre
addi t2, t2, 1
#-- Apuntar al siguiente caracter de la cadena de salida
addi t5, t5, 1
#-- Repetir
b bucle2
nombre_copiado:
# continuar recorriendo cadena template hasta el final y copiando en cadena de salida
#-- Hacer que t0 apunte al siguiente caracter tras la secuencia
addi t0, t0, 3 #3 es tamaño de secuencia
bucle3:
#-- Leer caracter del template
lb t1, 0(t0)
#-- Copiarlo en la cadena de salida
sb t1, 0(t5)
#-- Incrementar puntero de template y salida
addi t0, t0, 1
addi t5,t5,1
#-- Si el caracter leido del template es 0, hemos terminado
#-- De lo contrario repetimos el bucle
bne t1, zero, bucle3
# imprimir la cadena final
li a7, PRINT_STRING
la a0, salida
ecall
# salir
li a7, EXIT
ecall
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
TODO
Autores
- Juan Ignacio Pérez