Skip to content

Examen: Parcial 3:2026_05_11:Robotica

Miguel edited this page May 18, 2026 · 2 revisions

Examen Parcial 2: 2026-04-13. Robotica

  • Tiempo: 115 minutos
  • Descripción: Examen Parcial 1. Laboratorio. Grado en Ingeniería de Robótica Software
  • Fecha: 2026/May/11
  • Temario: Sesiones L9-L11

Contenido

Programa

Ejercicio 1.

Escribe un programa en RISC-V que pida una palabra al usuario y que la imprima por la consola lo siguiente:

  • La primera línea debe contener la palabra entera insertando un espacio en blanco entre cada carácter.
  • Cada siguiente línea ha de quitar el primer carácter a la palabra introducida por el usuario. Es decir, ha de formar una especie de triángulo.

Ejemplo de ejecución:

Introduzca una palabra (max 10 caracteres): **** user input : RISC-V
R I S C - V
 
I S C - V
 
S C - V
 
C - V
 
- V
 
V 

El programa escrito ha de cumplir las siguientes condiciones:

  • Se ha de implementar todo el programa en un único fichero de nombre triangle.s, tanto el cuerpo principal como las subrutinas requeridas.
  • Se ha de implementar con dos subrutinas recursivas.
    • Una que imprima una palabra (string) añadiendo los espacios entre las letras. La subrutina ha de llamarse line, recibe un parámetro con un puntero a la cadena a imprimir y no retorna nada
    • Otra que imprima el triángulo invocando a la función que imprime las palabras. La subrutina ha de llamarse triangle, recibe un parámetro con un puntero a la cadena a imprimir y no retorna nada
  • El cuerpo principal del programa ha de pedir al usuario la palabra a tratar y posteriormente invocar a la subrutina que imprime el triángulo
  • El tamaño de palabra máximo que puede introducir el usuario es de 10 caracteres.
  • A modo de guía, en python las funciones recursivas podrían ser como las siguientes:
def line(cad):
  if cad=="":
    return 
  else:
    print (cad[0] + " ")
    line (cad[1:])
    return

def triangle(cad):
    if cad=="":
      return 
    else:
      line(cad)
      triangle (cad[1:])
    return

Ejercicio 2.

Añade al programa anterior el código necesario para que mida dinámicamente el consumo de pila del mismo.

Para ello se ha de utilizar la librería adjunta que tiene las siguientes funciones:

  • register_sp_source: se utiliza al inicio para registrar el valor base de referencia del puntero de pila. En a0 recibe la dirección de memoria del puntero
  • register_sp_min: se utilizar para registrar el valor del puntero de pila en un momento dado. Se puede utilizar múltiples veces
  • get_sp_diff: una vez terminado el muestreo, retorna el tamaño máximo en bytes registrado (con register_sp_min) respecto a la dirección base indicada en registre_sp_source

Recomendación para la implementación:

Implementa el programa paso a paso verificando cada trozo de funcionalidad.

Posibles pasos:

  • Cuerpo principal del programa con petición de palabra de entrada
  • Implementación de función "line". En caso de necesitar depuración usa palabras cortas.
  • Implementación de función "triangle". En caso de necesitar depuración usa palabras cortas.
  • Guarda el fichero y crea copia para seguir trabajando con ejercicio 2
  • Registra puntero de pila antes de invocar a "triangle"
  • Añade mensaje de salida incluyendo el tamaño consumido de pila
  • Localiza las ubicaciones donde se añaden datos a la pila e implementa las llamadas a register_sp_min

Otras consideraciones:

  • Es necesario respetar ABI de RISC-V, especialmente con el manejo de los registros

Entrega

  • Fichero triangle.s con la implementación de los dos ejercicios, en caso de que el segundo no esté completo, entregar con la implementación del primero y triangle_ej2.s con la implementación parcial del segundo

Solución al programa

#Recursive triangle

	.include "servicios.asm"
	.eqv WORD_SIZE 11
	.data

wmsg:	.string "Introduzca una palabra (max 10 caracteres): "
inputword: .space WORD_SIZE

spmsg:	.string "El tamaño máximo de pila utilizado (en bytes): "	


	
	.text
	
	mv a0, sp
	jal register_sp_source
	
	la a0, wmsg
	li a7, PRINT_STRING
	ecall
	
	la a0, inputword
	li a1, WORD_SIZE
	li a7, READ_STRING
	ecall

	jal triangle
	
	la a0, spmsg
	li a7, PRINT_STRING
	ecall
	

	jal get_sp_diff
	
	li a7, PRINT_INT
	ecall
	
	li a7, EXIT
	ecall	
	
#=====================================================

#recursive line
#input
#a0: string
#output:
#a0: stack address


line:
	addi sp, sp, -16
	sw ra, 12(sp)
	sw a0, 8(sp) #guarda argumento de entrada

	mv a0, sp
	jal register_sp_min
	
	lw t1, 8(sp)
	lb t0, 0(t1)
	beqz t0, line_end

	

		
	
	
	mv a0, t0
	li a7, PRINT_CHAR
	ecall

	li a0, ' '
	li a7, PRINT_CHAR
	ecall


	lw a0, 8(sp)
	addi a0, a0, 1
	jal line 
	
	

line_end:	
	lw ra, 12(sp)
	addi sp, sp, 16
	ret

#====================
# Prints an string in a triangle recursively
# example for "man":
# man
# an
# n
#input:
# a0: string

triangle:

	addi sp, sp, -16
	sw ra, 12(sp)
	sw a0, 8(sp)


	mv a0, sp
	jal register_sp_min


	lw t1, 8(sp)
	lb t0, 0(t1)
	beqz t0, triangle_end
	
	mv a0, t1				
	jal line
	
	li a0,'\n'
	li a7, PRINT_CHAR
	ecall
	
	lw a0, 8(sp)
	addi a0, a0, 1
	jal triangle


triangle_end:
	lw ra,12(sp)
	addi sp, sp, 16
	ret

Autores

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