Skip to content

Examen: Parcial 3:2023_12_22:TELECO

Juan Gonzalez-Gomez edited this page Jan 10, 2024 · 1 revision

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

Contenido

Enunciado

El examen se ha realizado a través de Aula virtual. Tiene sólo una parte: un programa

Programa (10 ptos)

  • Ficheros a entregar:
    • Del ejercicio 1:
      • abs.s
      • 1_main.s
    • Del ejercicio 2:
      • triangulo.s

Ejercicio 1 (6 ptos)

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

Ejercicio 2 (4 ptos)

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

Solución al programa

Como siempre ocurre al programar, existen infinitas soluciones. Pero en todas ellas se debe respetar la especificación

Ejercicio 1 (6 puntos)

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

Ejercicio 2 (4 puntos)

  • 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)

Evaluación

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...

TEST automático

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

Preparando el entorno

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 y triangulo.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

Autores

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