-
Notifications
You must be signed in to change notification settings - Fork 22
Examen: Parcial 3:2024_05_06:Robótica
- 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
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>
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.
- Ficheros entregados:
El nombre del fichero solución no está especificado, por lo que se puede usar el que se quiera. Por ejemplo: cli.asm
- Fichero: 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
TODO
- Juan Ignacio Pérez Andrés (Nacho)
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