Skip to content

Examen: Parcial 3:2024_05_06:Robótica

Juan Gonzalez-Gomez edited this page May 7, 2024 · 8 revisions

Examen Parcial 3: 2024-05-06. Ingeniería en Robótica Software

  • Tiempo: 60 minutos
  • Descripción: Examen Parcial 3. Laboratorio. Grado de Ingeniería en Robótica Software
  • Fecha: 2024/Mayo/6
  • Temario: Sesiones L8, L9 y L10

Contenido

Enunciado

Se debe implementar un programa en lenguaje ensamblador RISC-V que pida continuamente números en una línea de comandos y que se van a representar en formato texto en pantalla en tamaño 5x5.

Para terminar la ejecución del programa, se ha de introducir el comando ‘q’ (quit) que indica el final. En caso de introducir algo que no sea un entero, se ha de mostrar un mensaje de error: “Formato de entero no reconocido”

Ejemplo:

numero> 234
===================
 ***** ***** *   *
     *     * *   *
 ***** ***** *****
 *         *     *
 ***** *****     *
===================

numero> 23j
Formato de entero no reconocido. Reintente
'q' para terminar

numero> 11
=============
     *     *
     *     *
     *     *
     *     *
     *     *
=============
numero> q
<fin>

Consideraciones adicionales

Se adjuntan dos librerías que incluyen funciones de soporte para la realización del ejercicio (se recomienda la utilización de todas) que no se pueden modificar:

  • print_helper.s tiene tres funciones/subrutinas finales: print_prompt, print_separator, print_line_big_number

  • positive_integer.s contiene una única función/subrutina: is_positive_integer

Se debe implementar una subrutina print_box para imprimir la cadena leída en el prompt con caracteres de tamaño 5x5. Ha de cumplir con las siguientes características:

  • Debe imprimir un separador al inicio y al final para delimitar la caja. Se ha de tener en cuenta el número de dígitos para hacer el marco superior e inferior (fila de caracteres ‘=’)

  • Debe de haber un espacio a la izquierda antes de pintar el primer dígito

  • Debe de haber un espacio de separación entre dígitos de tamaño 5x5

  • Debe de haber un espacio a la derecha después de pintar el último dígito

  • Consideraciones adicionales:
  • Las librerías no se pueden modificar. No hay que entregarlas
  • Se entregará al menos un fichero main.s que contiene el inicio del programa, pudiendo incluirse más ficheros con subrutinas y/o definiciones.

Solución

El nombre del fichero solución no está especificado, por lo que se puede usar el que se quiera. Por ejemplo: cli.asm

#Programa linea de comandos

	.include "syscalls.asm"

	.eqv MAX_COMMAND_SIZE 40


	.data
prompt: .string "numero>"
command:.space MAX_COMMAND_SIZE
error_message_no_integer:
	.string "Formato de entero no reconocido. Reintente.\n'q' para terminar\n"
	.text
	
cli_loop:

	#print prompt
	la a0, prompt
        jal print_prompt
	
	#read command
	la a0, command
	li a1, MAX_COMMAND_SIZE
	li a7, READ_STRING
	ecall
	
	#process if quit is requested
	lb t0, command
	li t1, 'q'
	beq t0, t1, fin
	
	#check input is a positive integer
	la a0, command
	li a1, 0
	jal is_positive_integer
	
	beq a0, zero, no_positive_integer
	#a0 contiene el numero de caracteres, llamar a creacion de caja con numero grande
	
	mv a1, a0 #number of chars
	la a0, command
	jal print_box
		
	b cli_loop

no_positive_integer:

	la a0, error_message_no_integer
	li a7, PRINT_STRING
	ecall
	b cli_loop		
fin:
	#print end message and quit
	li a7, EXIT
	ecall	
	

#Subrutina que imprime en consola el entero recibido en a0 (como string) que tiene una longitud de a1 caracteres
#Lo imprime dentro de una caja con separador superior e inferior y los caracteres con tamano 5x5
#Entrada
#a0: String con numero (no se comprueba que esta correctamente formado)
#a1: Numero de caracteres
#Salida
#(vacia)

print_box:
	addi sp, sp, -32
	sw ra, 28(sp) #guarda ra en pila
	sw a0, 24(sp) # guarda cadena a imprimir
	sw a1, 20(sp) # guarda numero de caracteres
	# posicion 16 de pila para ancho de linea de separador
	# posicion 12 de pila para iteraciones al imprimir linea
	# posicion 8 de pila para iteraciones de digito
	
	#calcula la anchura de las lineas => guarda en pila (offset - 8)
	li t0, 5
	mul t0,a1,t0
	add t0, t0, a1
	addi t0, t0, 1 
	sw t0, 16(sp)

	#imprime linea cabecera
	mv a0, t0
	li a1, '='
	jal print_separator


### Bucle para imprimir las cinco l�neas correspondientes al digito
	li t0, 1 #inicializa a primera linea
	sw t0, 12(sp)
five_lines_loop:

	#imprime primer espacio
	li a0, ' '
	li a7, PRINT_CHAR
	ecall

	#inicializa a primer char
	li t0, 0
	sw t0, 8(sp)
	
	## Bucle para iterar por los diferentes digitos
digits_loop:
	lw a1, 12(sp) #t0 contiene la linea a imprimir
	lw a0, 24(sp) #carga cadena a imprimir
	
	lw t1, 8(sp) #carga desplazamiento de cadena
	add t2, a0, t1 #t2 apunta el digito a imprimir
	li t3, '0'
	lb t4, 0(t2) # carga el digito a imprimir
	sub t2, t4, t3 #normaliza
	mv a0, t2
	jal print_line_big_number
	#a0 es valor de retorno de print_line_big_number y entrada para esto
	li a7, PRINT_STRING
	ecall

	#imprime separador entre digitos (o digito en blanco al final)
	li a0, ' '
	li a7, PRINT_CHAR
	ecall
	
	#incrementa el digito a procesar (pasa al siguiente digito) y lo guarda en pila	
	lw t0, 8(sp)
	addi t0, t0, 1
	sw t0, 8(sp)
	
	#compara si hemos llegado al numero maximo de digitos.
	lw t1, 20(sp) # carga el numero de digitos
	bne t0, t1, digits_loop	
        ## Fin de bucle para imprimir linea de digitos

	# imprime salto de linea
	li a0, '\n'
	li a7, PRINT_CHAR
	ecall

	# incrementa y pasa a siguiente linea
	lw t0, 12(sp)
	addi t0, t0, 1
	sw t0, 12(sp)								
	# comprobar si hemos recorrido ya las cinco lineas
	li t1,6
	blt t0, t1, five_lines_loop		

	#imprime separador del final
	lw a0, 16(sp) # recupera valor de ancho de columnas de pila
	li a1, '='
	jal print_separator
					
	lw ra, 28(sp) # restore RA				
	addi sp, sp, 32

	ret

Evaluación

TODO

Autor

  • Juan Ignacio Pérez Andrés (Nacho)

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