-
Notifications
You must be signed in to change notification settings - Fork 22
Examen: Parcial 2:2022_11_30:GISAM
- Tiempo: 50 minutos
- Descripción: Examen Parcial 2. Laboratorio. Grado de Ingeniería en Robótica Software
- Fecha: 2022/Noviembre/30
- Temario: Sesiones L5, L6, L7 y L8
El examen se ha realizado a través de Aula virtual. Tiene dos partes: Test y un programa
- 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
Escribe un programa para el procesador RV32I, en el fichero mayus.s. TODAS las constantes necesarias, de cualquier tipo, tienen que estar definidas en el fichero mayus.s (No puede haber otros ficheros)
El programa deberá pedir al usuario que introduzca una cadena en minúsculas. Este texto se pasará a mayúscula, y se guardará en otra zona de la memoria
La primera palabra del segmento de datos se DEBE dejar a 0, y NO se utilizará (Está reservada para guardar variables futuras). A continuación de ella se debe situar la cadena convertida a mayúsculas. Y detrás de esta se guarda la cadena original en minusculas introducida por el usuario
Para convertir a mayúsculas usamos el siguiente algoritmo, que consiste en sumar el valor -32
a todos los carateres de la cadena
- Inicializar el puntero a la cadena inicial (en minúsculas)
- Inicializar el puntero a la cadena destino (La que estará en mayúsculas)
- Leer el caracter actual de la cadena inicial
- Si este caracter es '\n', terminar
- Sumar el valor -32 al caracter actual
- Guardar este nuevo valor en la posición actual de la cadena destino
- Incrementar el puntero de cadena inicial
- Incrementar el puntero de la cadena destino
- Repetir desde el punto 3
En este pantallazo se muestra el funcionamiento
Suponiendo que cada instrucción tarda un ciclo en ejecutarse, obtendrás este bonus si consigues pasar la cadena "artemis" a mayúsculas empleando menos de 73 ciclos
NOTA: Envía el fichero mayus.s con la solución como una entrega del laboratorio
Como siempre ocurre al programar, existen infinitas soluciones. Pero en todas ellas se debe respetar la especificación
Este es el contenido del fichero mayus.s:
#-- Programa mayus.s. Convertir una cadena introducidda por el usuario
#-- de minúsculas a mayúsculas utilizando el siguiente algoritmo:
#--
# 1. Inicializar el puntero a la cadena inicial (en minúsculas)
# 2. Inicializar el puntero a la cadena destino (La que estará en mayúsculas)
# 3. Leer el caracter actual de la cadena inicial
# 4. Si este caracter es '\n', terminar
# 5. Sumar el valor-32 al caracter actual
# 6. Guardar este nuevo valor en la posición actual de la cadena destino
# 7. Incrementar el puntero de cadena inicial
# 8. Incrementar el puntero de la cadena destino
# 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
#-- Valor a sumar para convertir a mayusculas
.eqv TO_MAYUS -32
.data
#-- ESPECIFICACION: La primera palabra está reservada (e inicializada a 0)
.word 0
#-- ESPECIFICACION: Cadena destino (en mayúsuclas)
str_mayusc: .space MAX
#-- ESPECIFICACION: Cadena original (introducida por el usuario)
#-- en minusculas
str_minusc: .space MAX
#-- Resto de mensaje a imprimir
msg1: .string "Introduce cadena en minusculas: "
msg2: .string "Cadena en Mayusculas: "
.text
#-- Imprimir mensaje
la a0, msg1
li a7, PRINT_STRING
ecall
#-- Pedir cadena al usuario
la a0, str_minusc
li a1, MAX
li a7, READ_STRING
ecall
#--Pasar a mayuscula!!
# 1. Inicializar el puntero a la cadena inicial (en minúsculas)
#--- Se encuentra en a0
# 2. Inicializar el puntero a la cadena destino (La que estará en mayúsculas)
#-- Usamos a1 como puntero destino
la a1, str_mayusc
#-- Optimizacion! Ponemos el valor del salto de linea '\n' en el
#-- registro t1 para cumplir con el BONUS
li t1, '\n'
bucle:
# 3. Leer el caracter actual de la cadena inicial
#-- t0 ---> Caracter actual (en minusculas)
lb t0, 0(a0)
# 4. Si este caracter es '\n', terminar
beq t0,t1, fin
# 5. Sumar el valor para pasar a mayusculas (valor -32, en constante TO_MAYUS)
addi t2,t0,TO_MAYUS
# 6. Guardar este nuevo valor en la posición actual de la cadena destino
sb t2, 0(a1)
# 7. Incrementar el puntero de cadena inicial
addi a0,a0,1
# 8. Incrementar el puntero de la cadena destino
addi a1,a1,1
# 9. Repetir desde el punto 3
b bucle
#------------------
fin:
#-- Imprimir el segundo mensaje
la a0, msg2
li a7, PRINT_STRING
ecall
#-- Imprimir la cadena en mayusculas
la a0, str_mayusc
li a7, PRINT_STRING
ecall
#-- Terminar
li a7, EXIT
ecall
Este programa tarda 72 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
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...
TODO
- Katia Leal Algara
- Juan González-Gómez (Obijuan)
L1: Práctica 1-1. RARs
L2: Práctica 1-2. Ensamblador
L3: Práctica 1-3. Variables
L4: Pract 2-1. E/S mapeada
L5: Práctica 2-2: Inst. ecall
L6: Prác 2-3: Cadenas
L7: Práct 3-1: Bucles y saltos
L8: Práct 3-2: Cadenas II
L9: Pract 4-1: Subrut. Nivel-1
L10: Pract 4-2: La pila
L11: Pract 4-3: Recursividad
L12: Pract 5-1. Heap. Listas
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
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