Skip to content

Examen: Parcial 2:2022_11_30:GISAM

Juan Gonzalez-Gomez edited this page Dec 2, 2022 · 4 revisions

Examen Parcial 2: 2022-11-30. Ingeniería en Sistemas Audiovisuales y Multimedia

  • 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

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)

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

  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

En este pantallazo se muestra el funcionamiento

Bonus: Optimización en tiempo.

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

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 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

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

Licencia

Enlaces

Página principal


Sesiones de Prácticas

P1: Simulador RARs

L1: Práctica 1-1. RARs
L2: Práctica 1-2. Ensamblador
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

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
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

SOLUCIONES

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

Clone this wiki locally