Examen: Parcial 2:2023_03_27:Robótica - myTeachingURJC/2019-20-LAB-AO GitHub Wiki
Examen Parcial 2: 2023-03-27. Ingeniería en Robótica Software
- Tiempo: 50 minutos
- Descripción: Examen Parcial 2. Laboratorio. Grado de Ingeniería en Robótica Software
- Fecha: 2023/Marzo/27
- Temario: Sesiones L5, L6, y L7
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 en ensamblador del RISC-V, en el fichero conv_dec_hex.s
, que pida al usuario un número entero y lo imprima en hexadecimal. Esta operación se debe repetir en un bucle hasta que el usuario introduce el número 0. En ese momento se termina el programa
En este pantallazo se muestra la salida del programa cuando el usuario introduce los números 15, 255 y 0 (para terminar). Utiliza exactamente las mismas cadenas y saltos de línea (ESPECIFICACIÓN)
Utiliza uno de los servicios del sistema operativo para realizar la conversión de decimal a hexadecimal
Todas las constantes del sistema operativo deben definirse en el fichero serv.s
Bonus
El número introducido por el usuario, si es diferente de 0, se debe almacenar en la dirección 0x10010040 del segmento de datos. El programa completo (con los bonus) debe ocupar menos de 22 instrucciones
NOTA: Envía ambos ficheros (conv_dec_hex.s
y serv.s
), de forma independiente, a través de la entrega de prácticas
Solución
Este es el programa completo, junto con los bonus
#-- Conversor de decimal a hexadecimal
#-- Pedir número en decimal
#-- Terminar al introducir el número 0
#-- Constantes del sistema operativos (ESPECIFICACION)
.include "serv.s"
#-- Mensajes a mostrar al usuario (ESPECIFICACION)
.data
msg1: .string "\n\nIntroduce numero en decimal: "
msg2: .string "Valor en hexadecimal: "
.text
bucle:
#---------- Mostrar mensaje 1
la a0, msg1
li a7, PRINT_STRING
ecall
#--- Pedir numero al usuario
li a7, READ_INT
ecall
#-- a0: Contiene el numero en decimal
mv t0, a0
##-- Comprobar si el numero es 0.
##-- Si es asi, terminar
beq t0, zero, fin
##--- BONUS-----
#-- Almacenar el numero en la direccion 0x10010040
la t1, msg1
sw t0, 0x40(t1)
#--- Fin BONUS
#------ Imprimir el mensaje 2
la a0, msg2
li a7, PRINT_STRING
ecall
#-- Imprimir numero en hexadecial
mv a0, t0
li a7, PRINT_INT_HEX
ecall
#-- Repetir
b bucle
fin:
#-- Terminar
li a7, EXIT
ecall
Este programa tiene 21 instrucciones en código máquina, por lo que se cumple el Bonus
Este es el fichero serv.s
con las constantes de los servicios del sistema operativo:
#-- Código de los servicios del sistema operativo
.eqv PRINT_INT 1
.eqv READ_INT 5
.eqv PRINT_STRING 4
.eqv READ_STRING 8
.eqv PRINT_CHAR 11
.eqv READ_CHAR 12
.eqv PRINT_INT_HEX 34
.eqv EXIT 10
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
El script de test está disponible, por si quieres probarlo con tus programas para practicar. También está disponible un mini-script para bajarse el rars 1.5 desde el repositorio de github
- Script de Test: TEST.zip
- Script de descarga del RARs: get_rars.sh
Preparando el entorno
Estos scripts se han hecho para ejecutarse en la bash de LINUX
Sigue lo siguientes pasos:
- Crea un directorio donde se realizarán las pruebas. Por ejemplo Parcial-2
- Pon en ese directorio el programa realizado:
conv_dec_hex.s
yserv.s
, o puedes bajarte los ficheros ya solucionados: conv_dec_hex.s, serv.c - Descomprime el archivo TEST.zip. Se crea el directorio TEST. Mete ahí los siguientes ficheros:
get_rars.sh
--> (Opcional) Script para descargar el RARsrars1_5.jar
--> El simulador RARs
En el directorio TEST necesitas tener el RARs. Si ya lo tienes descargado copialo a TEST. Si no lo tienes, ejecuta el script de descarga (get_rars.sh). Estos son los ficheros de la carpeta Test:
obijuan@Hoth:~/Parcial-2/TEST$ ls
get_rars.sh TEST-01.sh
Ejecutamos el script get_rars.sh:
obijuan@Hoth:~/Parcial-2/TEST
$ ./get_rars.sh
--2023-03-05 11:53:47-- https://github.com/TheThirdOne/rars/releases/download/v1.5/rars1_5.jar
Resolving github.com (github.com)... 140.82.121.4
[....]
rars1_5.jar 100%[======================================>] 1,76M 9,79MB/s in 0,2s
2022-11-04 09:15:40 (8,71 MB/s) - ‘rars1_5.jar’ saved [1843878/1843878]
obijuan@Hoth:~/Test$
Ahora ya tenemos todos los ficheros:
obijuan@Hoth:~/Parcial-2/TEST$ ls
get_rars.sh rars1_5.jar TEST-01.sh
Para realizar la prueba hay que ejecutar el script TEST-01.sh
:
obijuan@Hoth:~/Parcial-2/TEST$ bash TEST-01.sh
Esta es la salida:
-----Ejecutando TEST-01-----
> rars1_5.jar existe
> ✅️ ../conv_dec_hex.s existe
> ✅️ ../serv.s existe
> ➡️ PROBANDO: ../conv_dec_hex.s
java -jar rars1_5.jar nc me ic dump 0x10010040-0x10010044 HexText mem.hex 10000 dump .text HexText code.hex ../conv_dec_hex.s
> ✅️ mem.hex generado
> ✅️ Consola salida: Mensaje 1
> ✅️ Consola salida: Mensaje 2
> ✅️ Conversion de 15 OK
> ✅️ Conversion de 255 OK
> ✅️ Servicio 34 definido
> ✅️ El programa termina llamando a EXIT
> Instrucciones totales: 21
> 😀️ 0x10010040: 000000ff
> ✅️🎖️ BONUS!!!
> Ciclos de ejecución: 47
> SALIDA EN CONSOLA
Introduce numero en decimal: Valor en hexadecimal: 0x0000000f
Introduce numero en decimal: Valor en hexadecimal: 0x000000ff
Introduce numero en decimal:
------FIN-------
Al terminar se queda esperando a que apretemos ENTER
El script es muy básico, y no detecta toda la casuistica, pero sí permite detectar las violaciones de las ESPECIFICACIONES
Autores
- Katia Leal Algara
- Juan González-Gómez (Obijuan)