-
Notifications
You must be signed in to change notification settings - Fork 22
Examen: Parcial 3:2023_12_22:TELECO
- Tiempo: 1 hora
- Descripción: Examen Parcial 3. Laboratorio. Grados de Telecomunicaciones
- Fecha: 2023/Diciembre/22
- Temario: Sesiones L8, L9 y L10
El examen se ha realizado a través de Aula virtual. Tiene sólo una parte: un programa
- Descargar las plantillas: Plantillas.zip
- Ficheros a entregar:
- Del ejercicio 1:
- abs.s
- 1_main.s
- Del ejercicio 2:
- triangulo.s
- Del ejercicio 1:
Implementar la función abs(n) en ensamblador de un RV32I. Esta función calcula el valor absoluto de un número entero. Tiene un argumento de entrada: el número entero y uno de salida: su valor absoluto. Como el procesador es un RV32I, NO podemos usar la instrucción de multiplicación
Para probar la función utilizamos un programa principal que pide al usuario un número entero, llama a abs() con este número para obtener su valor absoluto, lo imprime en la consola y repite el proceso. Cuando el usuario introduce el número 0 el programa principal termina
En esta animación se muestra el proceso:
Se pide:
a) (3 ptos) Implementar la función abs(n) en el fichero abs.s
b) (3 ptos) Implementar el programa principal en el fichero 1_main.s
. Todas las constantes necesarias para acceder
a los servicios del sistema operativo deben estar definidas dentro de este fichero
Nuestro jefe de proyecto nos ha proporcionado dos funciones y un programa principal, situados en ficheros separados:
- Función linea(n): Dibujar una linea de n asteriscos. Situado en el fichero
linea.s
- Función triangulo(): Dibujar un triángulo de 5 líneas de altura. Situado en el fichero
triangulo.s
- Programa principal: Dibuja dos triangulos. Situado en el fichero
2_main.s
Tanto el programa principal como la función linea() funcionan correctamente. Sin embargo, la función triangulo() necesita que la modifiquemos para que funcione correctamente
La salida del programa principal, con la función triangulo() correcta, es la mostrada en esta figura:
Se pide:
- (4 ptos) Modifica la función triangulo para que el programa principal funcione correctamente. Sólo puedes añadir código en las zonas indicadas en los comentarios. No puedes modifcar el CÓDIGO ORIGINAL
Como siempre ocurre al programar, existen infinitas soluciones. Pero en todas ellas se debe respetar la especificación
Este es el contenido del fichero abs.s:
#---------------------------------------
#-- Funcion abs(n)
#-- Devolver el valor absoluto de n
#--
#-- ENTRADA:
#-- a0: (n): Numero entero (positivo o negativo)
#-- SALIDA:
#-- a0: abs(n): Valor absoluto de n
#--------------------------------------------------
.globl abs
.text
abs:
#-- Si el numero es mayor que cero, hemos terminado
bgt a0, zero, fin
#-- En el resto de casos hay que cambiar el signo de a0
#-- a0 = 0 - a0
sub a0, zero, a0
fin:
ret
- Este es el fichero 1_main.s:
#--------------------------------------
#-- Programa principal
#--
#-- Comprobar el funcionamiento de la
#-- funcion abs(n)
#----------------------------------------
#-- Servicios del sistema operativo
.eqv PRINT_STRING 4
.eqv READ_INT 5
.eqv PRINT_INT 1
.eqv EXIT 10
.data
msg1: .string "\nIntroduce numero: "
msg2: .string "Valor absoluto: "
.text
bucle:
#-- Imprimir mensaje
la a0, msg1
li a7, PRINT_STRING
ecall
#-- Pedir entero al usuario
li a7, READ_INT
ecall
#-- Si el numero introducido es 0 terminamos
beq a0, zero, fin
#-- Calcular valor absoluto
jal abs
#-- a0 contiene el valor absoluto
mv t0, a0
#-- Imprimir mensaje 2
la a0, msg2
li a7, PRINT_STRING
ecall
#-- Imprimir el valor absoluto
mv a0,t0
li a7, PRINT_INT
ecall
#-- Repetir
b bucle
fin:
#-- Terminar
li a7, EXIT
ecall
- Este es el fichero
triangulo.s
solución:
#-----------------------------------------------------------
#-- triangulo: Dibujar un triangulo de 4 lineas
#--
#-- ENTRADAS:
#-- Ninguna
#-- SALIDA:
#-- Ninguna
#----------------------------------------------------------
.globl triangulo
#-- Lineas del triangulo
.eqv MAX 4
.text
triangulo:
#-- Añade aquí lo que consideres necesario
#-- Reservar espacio para la pila
addi sp,sp,-16
#-- Guardar la direccion de retorno
sw ra, 12(sp)
#-- Guardar el registro s0 en la pila para
#-- respetar el convenio de uso de registros
sw s0, 0(sp)
#---------------------------------------
#-- CODIGO ORIGINAL: NO CAMBIAR NADA
#--------------------------------------
#-- Inicializar contador de lineas
li s0,1
bucle:
#-- Dibujar linea de s0 caracteres
mv a0,s0
jal linea
#-- Incrementar contador de linea (y numero de caracteres)
addi s0,s0,1
#-- Si hemos completado la cantidad de lineas: terminar
li t0,MAX
ble s0,t0,bucle
#-- Fin.... Hemos terminado
#--------------------------
#-- FIN DEL CODIGO ORIGINAL
#-------------------------
#-- Añade aqui lo que consideres necesario
#-- Recuperar s0
lw s0, 0(sp)
#-- Recuperar la direccion de retorno
lw ra, 12(sp)
#-- Liberar la pila
addi sp,sp,16
ret
Como se trata de una función intermedia, es necesario crear la pila para guardar la dirección de retorno (ra). Si no se guarda la dirección y se recupera antes de terminar, el programa se queda en un bucle infinito
Además, para cumplir con el convenio de uso de registros, hay que almacenar el registro estático s0 en la pila, y recuperarlo al salir (ya que en el código se usa este registro, y ese código no lo podemos modificar según las especificaciones)
La evaluación de cada apartado se hace en dos fases. Sea P la puntuación asignada a ese apartado:
-
Funcionalidad (P/2 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 (P/2 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
Los scripts de test están disponible, por si quieres probarlos con tus programas para practicar
Los scripts de test se debe ejecutan en la terminal de LINUX
Sigue lo siguientes pasos:
- Crea un directorio donde se realizarán las pruebas. Por ejemplo Parcial3
- Pon en ese directorio los ficheros pedidos en el enunciado:
abs.s
,1_main.s
ytriangulo.s
, o puedes bajarte los ficheros solucion: abs.s, 1_main.s y triangulo.s - Descarga los ficheros con los escript de tests: TEST1.zip y TEST2.zip
- Cópialos en el directorio
Parcial3
- Descomprímelos
La estructura queda así:
$ tree
Parcial3
├── 1_main.s
├── abs.s
├── TEST1
│ ├── abs_SOL.s
│ ├── abs_TB.s
│ ├── input.txt
│ ├── servicios.s
│ ├── system.h
│ ├── test-1-a.py
│ ├── test-1-b.py
│ ├── test-1-c.py
│ └── test.h
├── TEST2
│ ├── 2_main.s
│ ├── linea.s
│ ├── servicios.s
│ ├── so.s
│ ├── system.h
│ ├── test-2-a.py
│ ├── test-2-b.py
│ ├── test.h
│ └── triangulo_TB.s
└── triangulo.s
Ejecutamos el script correspondiente al problema y apartado a probar. Por ejemplo, para probar el apartado a del problema 1 ejecutamos lo siguiente:
obijuan@Hoth:~/Parcial3/TEST1
$ ./test-1-a.py
────────────────────────────────────────
ARQUI-BOT
────────────────────────────────────────
> ❌️ RARS no existe
> Descargando RARS desde la URL: https://github.com/TheThirdOne/rars/releases/download/v1.5/rars1_5.jar
> OK!
> ✅️ RARS EXISTE
> ✅️ abs_TB.s existe
> Probando: abs_TB.s
> Ejecutando: java -jar rars1_5.jar x10 nc me ic 10000 dump .text HexText text.hex abs_TB.s ../abs.s
> ✅️ Convenio OK!
> ✅️ ABS(-5)=5
> ✅️ ABS(23)=23
> ✅️ ABS(-23)=23
> ✅️ El programa termina llamando a EXIT
> Instrucciones totales: 147
> Ciclos de ejecución: 134
────────────────────────────────────────
SALIDA programa:
Convenio OK!!
OK!!
OK!!
OK!!
Pulsa ENTER...
Primero comprueba si en el directorio está el fichero rars_1.5.jar. Si no es así, se lo baja del repositorio. A continuación analiza el fichero abs.s
y muestra en la salida los resultados
Los scripts son muy básicos, y no detectan toda la casuistica, pero sí permiten encontrar la mayoría de las violaciones de las ESPECIFICACIONES
- 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