-
Notifications
You must be signed in to change notification settings - Fork 22
Examen: Parcial 3:2022_12_21:GISAM
- Tiempo: 1 hora
- Descripción: Examen Parcial 3. Laboratorio. Grado de Ingeniería en Robótica Software
- Fecha: 2022/Diciembre/21
- Temario: Sesiones L9 y L10
El examen se ha realizado a través de Aula virtual. Tiene sólo una parte: un programa
Escribe un programa en ensamblador para un Riscv RV32I:
a) (5 ptos) Implementar la función doble(n), que toma el valor entero n y devuelve el doble. Esta función tiene un parámetro de entrada (n) y un valor de retorno (el valor doble). Por ejemplo, la llamada a la función doble(8) nos devolverá el valor 16. Recuerda que el RV32I NO tiene la instrucción de multiplicación (por lo que no la puedes usar). Esta función debe estar implementada en el fichero doble.s
b) (5 ptos) Implementa un programa principal en el fichero main.s. Este programa deberá pedir un número entero al usuario y mostrará en pantalla su valor doble, siguiendo el formato indicado en este pantallazo de ejemplo
NOTA: Todas las constantes necesarias para los servicios del sistema operativo deberán estar en el fichero so.s
NOTA: Ficheros a entregar:
- so.s
- doble.s
- main.s
Como siempre ocurre al programar, existen infinitas soluciones. Pero en todas ellas se debe respetar la especificación
Este es el contenido del fichero doble.s:
#----------------------------------------------------------------
#-- Funcion doble(n): Calcula el doble del numero recibido
#-------------------------------
#-- ENTRADAS:
#-- * a0: Numero a doblar
#-- SALIDAS:
#-- * a0: Numero doble (2 * a0)
#----------------------------------------------------------------
.globl doble
.text
doble:
#-- Es una función hoja, por lo que no hay que guardar la direccion
#-- de retorno en la pila
add a0, a0, a0
ret
- Este es el fichero main.s:
#----------------------------------
#-- Programa principal:
#----------------------------------
.include "so.s"
.data
#-- Mensajes indicados en la ESPECIFICACION
msg1: .string "Introduzca un numero entero: "
msg2: .string "El doble de "
msg3: .string " es "
.text
#------ Pedir un numero al usuario
#-- Imprmir los mensajes pedidos (ESPECIFICACION)
la a0, msg1
li a7, PRINT_STRING
ecall
#-- Lectura del numero entero (n)
li a7, READ_INT
ecall
#-- a0 contiene el numero introducido por el usuario
#-- Lo guardamos en s0 para no perderlo
mv s0, a0
#-- Calcular el doble del numero
jal doble
#-- a0 contiene el doble
mv s1, a0 #-- Guardar el doble en s1
#-- Imprimir el resultado:
la a0, msg2
li a7, PRINT_STRING
ecall
#-- Imprimir el numero original
mv a0, s0
li a7, PRINT_INT
ecall
#-- Imprimir el mensaje 3
la a0, msg3
li a7, PRINT_STRING
ecall
#-- Imprimir el resultado
mv a0, s1
li a7, PRINT_INT
ecall
#-- Terminar
li a7, EXIT
ecall
Todas las constantes utilizadas se deben meter en el fichero so.s (ESPECIFICACIONES):
#-- Código de los servicios del sistema operativo
#-- Incluir estos archivos en tus programas
#-- para acceder a ellos fácilmente, y hacerlos más
#-- legibles
.eqv PRINT_STRING 4
.eqv READ_STRING 8
.eqv READ_INT 5
.eqv PRINT_INT 1
.eqv PRINT_CHAR 11
.eqv READ_CHAR 12
.eqv EXIT 10
La evaluación de cada apartado 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...
La comprobación de las especificaciones se hace mediante programas de test independientes. Cada apartado se prueba de forma independiente. Si por ejemplo en un apartado me piden que implemente una función, esta se prueba contra un programa principal de prueba (NO el proporcionado por el estudiante). Y al revés, si se pide un programa principal, se prueba contra las funciones correctas (no las proporcionadas por el estudiante). Esto permite determiar si la interfaz implementada es al correcta, así como si se ha violado algún convenio
Para ejecutar los scripts de prueba se debe descomprimir el fichero test1.zip en el directorio donde están nuestros programas. La estrucutra de directorios será la siguiente:
Mis programas.s
└── TEST1
├── doble_TB.s
├── get_rars.sh
├── main_TB.s
├── msg.txt
├── servicios.s
├── system.h
├── TEST-a.sh --> Script de prueba del apartado a
├── TEST-b-1.sh --> Script de prueba del apartado b
├── TEST-b-2.sh --> Prueba del programa del estudiante
└── test.h
En el mismo directorio de TEST1 necesitas tener el RARs. Si ya lo tienes descargado copialo a TEST1. Si no lo tienes, ejecuta el script de descarga (get_rars.sh). Estos son los ficheros de la carpeta Test:
obijuan@Hoth:~/Test$ ls
calc.s get_rars.sh TEST-01.sh
Ejecutamos el script get_rars.sh:
obijuan@Hoth:~/Examen/Programa-1/TEST1
$ bash get_rars.sh
--2023-01-19 12:07:51-- https://github.com/TheThirdOne/rars/releases/download/v1.5/rars1_5.jar
Resolving github.com (github.com)... 140.82.121.4
Connecting to github.com (github.com)|140.82.121.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: [...]
[...]
HTTP request sent, awaiting response... 200 OK
Length: 1843878 (1,8M) [application/octet-stream]
Saving to: ‘rars1_5.jar’
rars1_5.jar 100%[===================>] 1,76M 8,91MB/s in 0,2s
2023-01-19 12:07:52 (8,91 MB/s) - ‘rars1_5.jar’ saved [1843878/1843878]
Por ejemplo, supongamos que tenemos los ficheros el programa 1 en la carpeta programa-1
. Para comprobar el apartado a ejecutamos este comando:
obijuan@Hoth:~/Examen/Programa-1/TEST1$ bash TEST-a.sh
La salida que aparecerá en la pantalla, si el fichero del apartado a es correcto, será similar a esta:
-----Ejecutando TEST-a-1-----
> ✅️ rars1_5.jar existe
> ✅️ doble.s existe
> ➡️ PROBANDO: doble.s
java -jar rars1_5.jar nc me ic 10000 main_TB.s ../doble.s
> COMPROBANDO VALORES recibidos
> ✅️ doble(8)=16. OK!
> ✅️ Convenio OK!
> ✅️ doble(1)=2. OK!
> ✅️ Convenio OK!
> ✅️ doble(16)=32. OK!
> ✅️ Convenio OK!
> Salida en consola:
16
Convenio OK!!
2
Convenio OK!!
32
Convenio OK!!
> Ciclos de ejecución: 296
> ✅️ El programa termina llamando a EXIT
------FIN-------
- Katia Leal Algara
- Juan González-Gómez (Obijuan)
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