Skip to content

Examen: 2026_06_25:TELECO

Juan Gonzalez-Gomez edited this page Jun 26, 2026 · 13 revisions

Examen convocatoria extraordinaria: 2026-06-25. TELECO

  • Asignatura: Arquitectura de computadores
  • Grado: Teleco
  • Tiempo: 2h
  • Ficheros a entregar:
    • Del ejercicio 1:
      • main1.s
    • Del ejercicio 2:
      • polinomio.s
      • main2.s
  • Utiliza la plantilla que se proporciona: Plantilla.zip
  • Utiliza el fichero so.s proporcionado para las constantes de los servicios del sistema operativo

Contenido

Ejercicio 1 (5 ptos)

Estamos desarrollando un proyecto software para un procesador RV32I, que NO incluye la instrucción de multiplicación. Para poder realizar multiplicaciones nuestro jefe de proyecto nos proporciona la funcion mul2u(a,b), que realiza la multiplicación de dos operandos sin signo, y devuelve el resultado. Por ejemplo, mul2u(2,3) devuelve 6

El jefe de proyecto necesita que implementemos un programa principal para comprobar si mul2u(a,b) funciona correctamente. Este programa de prueba debe funcionar siguiendo este algoritmo:

  1. Pedir un numero al usuario (a)
  2. Si a es un número negativo, saltar al punto 8
  3. Pedir un segundo número al usuario (b)
  4. Si b es un número negativo, saltar al punto 8
  5. Realizar la multiplicacion: res = mul2u(a,b)
  6. Mostrar el mensaje a * b = res en la consola
  7. Repetir desde el punto 1
  8. Terminar

En este pantallazo se muestra un ejemplo de funcionamiento de este programa, cuando el usuario realiza las operaciones 2 * 3, 8 * 4 y luego introduce -1 para terminar

Se pide:

a) (5 ptos) Implementar el programa principal de prueba en el fichero main1.s

Ejercicio 2 (5 ptos)

Ahora que ya sabemos que mul2u(a,b) funciona, nuestro jefe de proyecto necesita que implementemos la función polinomio(x) que evalúa el polinomio x² + x + 1 y devuelve el resultado. Así, polinomio(1) = 3 y polinomio(2) = 7. La función poliniomio(x) se debe implementar llamando a la función mul2u(a,b)

Para comprobar que polinomio(x) funciona, se necesita un programa principal de prueba que evalúe el polinomio para los valores desde x=0 hasta x=5. La salida en la consola de este programa debe ser como se indica en este pantallazo:

Se pide:

a) (3 ptos) Implementar la funcion para evaluar el polinomio (polinomio) en el fichero polinomio.s

b) (2 ptos) Implementar el programa de pruebas para evaluar el polinomio en el fichero main2.s

SOLUCIONES

Ejercicio 1

  • Fichero: main1.s
	#-- Servicios del sistema operativo
	.include "so.s"

		.data
msg1:	.string "\nIntroduzca numero a: "
msg2:   .string "Introduzca numero b: "
msg3:   .string " * "
msg4:   .string " = "

	.text

bucle:
	# -------- Pedir numero a
	la a0, msg1
	li a7, PRINT_STRING
	ecall

	# -- Lectura del numero
	li a7, READ_INT
	ecall

	# -- s0: Primero numero
	mv s0, a0

	# --- Si a < 0, terminar
	blt s0, zero, fin


	# ------- Pedir numero b
	la a0, msg2
	li a7, PRINT_STRING
	ecall

	# -- Lectura del numero
	li a7, READ_INT
	ecall

	# -- s1: Segundo numero
	mv s1, a0

	# --- Si b < 0, terminar
	blt s1, zero, fin

	# -- Llamar a mul(a,b)
	mv a0, s0
	mv a1, s1
	jal mul2u

	# -- Guardar resultado en s2
	mv s2, a0

	# -- Imprimir el operando a
	mv a0, s0
	li a7, PRINT_INT
	ecall

	# -- Imprimir el simbolo de multiplicacion
	la a0, msg3
	li a7, PRINT_STRING
	ecall

	# -- Imprimir el operando b
	mv a0, s1
	li a7, PRINT_INT
	ecall

	# -- Imprimir el simbolo de igualdad
	la a0, msg4
	li a7, PRINT_STRING
	ecall

	# -- Imprimir el resultado
	mv a0, s2
	li a7, PRINT_INT
	ecall

	# -- Repetir
	j bucle

	#-- Terminar
fin:
	li a7, EXIT
	ecall

Ejercicio 2

  • Fichero: polinomio.s
	.globl polinomio

	.text
# --------------------------------------------
# -- polinomio. Funcion para evaluar el polinomio 
# --  p(x) = x² + x + 1
# --
# -- ENTRADAS:
# --  a0: x
# -- SALIDAS:
# --- a0: p(x)
polinomio:

	# -- Se trata de una funcion intermdia
	# -- Hay que crear la pila y guardar la direccion de retorno
	addi sp, sp, -16
	sw ra, 12(sp)

	# -- Guardar el registros s0 en la pila
	sw s0, 0(sp)

	# -- Calcular p = x² + x + 1
	# --          t1  t0  s0
	#-- a0 = x
	
	# -- s0: x
	mv s0, a0
	
	#-- t0 = x²
	mv a1, a0
	jal mul2u
	
	#-- t1 guarda el resultado parcial
	# -- t1 = x² + x
	add t1, a0, s0
	
	#-- Resultado final
	addi t1, t1, 1
	
	# -- Devolver resultado
	mv a0, t1
	
	# -- Recuperar el registro s0 de la pila
	lw s0, 0(sp)

	# -- Recuerar direccion de retorno
	# -- y liberar la pila
	lw ra, 12(sp)
	addi sp, sp, 16
	
	ret
  • Fichero: main2.s
	#-- Servicios del sistema operativo
	.include "so.s"

	.eqv MAX 5

		.data
msg1:	.string "\nEvaluando polinomio para x="
msg2:   .string " ---> P(x)="

	.text


	# -- Contador
	li s0, 0

bucle:
	# -- Imprimir mensaje
	li a7, PRINT_STRING
	la a0, msg1
	ecall
	
	# -- Imprimir el contador
	mv a0, s0
	li a7, PRINT_INT
	ecall

	# -- Imprimir mensaje del resultado
	la a0, msg2
	li a7, PRINT_STRING
	ecall

	# --- Calcular P(2)
	mv a0, s0
	jal polinomio
	
	#-- Imprimir resultado
	li a7, PRINT_INT
	ecall
	
	# -- Comprobar si hemos llegado al valor maximo
	# -- de x
	li t0, MAX
	beq s0, t0, fin
	
	# -- Incrementar contador
	addi s0, s0, 1
	
	#-- Repetir
	j bucle


	#-- Terminar
fin:
	li a7, EXIT
	ecall

Evaluación

Dentro de cada apartado se evalúan 2 aspectos: funcionalidad y código. Cada uno tiene asignado la mitad de la puntuación del enunciado

  • Funcionalidad: Se comprueba si la función/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. Se quitan puntos según los errores encontrados:

    • Violación de especificaciones: -0.5
    • Programa no ensambla: -0.5
    • Warning en el ensamblado (-0.5)
    • Error en tiempo de ejecución al pasar las pruebas: Runtime error: -0.5
    • Retraso en la entrega: -0.5
    • No hay segmento de código: -0.5
    • Variable no contiene el valor correcto: -0.5
    • El programa no termina (-0.5): No se llama al servicio exit del sistema operativo para terminar el programa de forma controlada
    • VIOLACION DEL CONVENIO DE USO DE REGISTROS (-0.5). Algún registro estático se ha modificado al ejecutar la función
    • La función no pasa ninguno de los test de funcionalidad (Nota 0 en apartado de funcionalidad)
    • ...
  • Código: Se inspecciona visualmente cómo está hecho el código: código limpio, claro, con comentarios, instrucciones correctas, fallos de programación, etc... Se restan puntos por errores encontrados en el código:

    • Código sin sentido (-0.5): Se ha introducido una instrucción, o directiva, que no tiene relación con el enunciado y no se da una explicación explícita de porqué se ha puesto
    • Comentario contradictorio (-0.5): La instrucción hace una cosa, pero en los comentarios se indica otra distinta
    • Comentarios no coherentes (-0.5): Se indica algo en los comentarios que no tiene nada que ver con el código que se está escribiendo
    • Uso de un registro NO inicializado (-0.5)
    • Violacion de especificaciones (-0.5)
    • VIOLACION DEL CONVENIO DE USO DE REGISTROS (-0.5)
    • Instrucción incorrecta (-0.5)
    • Instrucción innecesaria (-0.5)
    • Etiqueta no definida como global (-0.5)
    • Dato inventado (-0.5). El código añade algo, o supone algo que no tiene sentido según lo que dice el enunciado
    • No hay comentarios, o son muy escasos (-0.5)
    • Función con 2 puntos de salida (-0.5)
    • VIOLACION DE LA ABI: (-0.5)
    • Uso de número mágico (-0.5)
    • ...

TEST automático

Para comprobar la funcionalidad se utiliza la herramienta Arquibot, que son un conjunto de programas python que ejecutan el simulador RARS en línea de comando y comprueban el funcionamiento correcto del programa en ensamblador entregado por el estudiantado

Para comprobar tu solución sigue estas instrucciones:

  1. Descarga este fichero: arquibot-0.7.zip
  2. Crea un directorio donde se realizarán las pruebas. Por ejemplo Extra
  3. Pon en ese directorio tus soluciones. Ficheros: main1.s, main2.s y polinomio.s, o puedes bajarte los ficheros ya solucionados: main1.s, main2.s, polinomio.s y so.s
  4. Descomprime en ese directorio el fichero arquibot-0.7.zip

La estructura queda así:

Extra/
├── arquibot-0.7
│   ├── 2026-06-25-mul2u.s
│   ├── 2026-06-25-polinomio_SOL.s
│   ├── 2026-06-25-polinomio_TB.s
│   ├── arquibot
│   │   ├── ansi.py
│   │   ├── __pycache__
│   │   │   ├── ansi.cpython-312.pyc
│   │   │   ├── rars.cpython-312.pyc
│   │   │   ├── rars.cpython-314.pyc
│   │   │   └── util.cpython-312.pyc
│   │   ├── rars.py
│   │   └── util.py
│   ├── run1.py
│   ├── run2.py
│   ├── run3.py
│   ├── so.h
│   └── test.h
├── main1.s
├── main2.s
├── polinomio.s
└── so.s

Ejecutamos el script run1.py:

obijuan@JANEL:~/test/Extra/arquibot-0.7$ ./run1.py 
────────────────────────────────────────
ARQUI-BOT 0.7
────────────────────────────────────────
> 🤚 RARS no existe
  > Descargando RARS
  > OK! 

> ☑️  RARS EXISTE
> ✅️ ../main1.s existe
> ✅️ 2026-06-25-mul2u.s existe
> Probando: ../main1.s
> Ejecutando: java -jar rars1_6.jar x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 nc me ic 10000 dump 0x10010000-0x10010100 HexText data.hex dump .text HexText text.hex ../main1.s 2026-06-25-mul2u.s
> ✅️ Hay segmento de datos
> ✅️ Hay segmento de código
  ──────── Salida en consola

Introduzca numero a: Introduzca numero b: 2 * 3 = 6
Introduzca numero a: Introduzca numero b: 8 * 4 = 32
Introduzca numero a: 
  ──────── Comprobando cadenas
> ✅️ Introduzca numero a:
> ✅️ Introduzca numero b:
> ✅️ 2 * 3 = 6
> ✅️ 8 * 4 = 32
  ──────── Comprobaciones finales
> ✅️ Se termina con EXIT
> Instrucciones totales: 52
> Ciclos de ejecución: 546
────────────────────────────────────────

Este script primero comprueba si en el directorio está el fichero rars_1.6.jar. Si no es así, lo baja del repositorio. A continuación analiza los ficheros del programa y muestra en la salida los resultados

  • Ejecutamos el script run2.py:
obijuan@JANEL:~/Parcial3/arquibot-0.6$ ./run2.py 
obijuan@JANEL:~/test/Extra/arquibot-0.7$ ./run2.py 
────────────────────────────────────────
ARQUI-BOT 0.7
────────────────────────────────────────
> ☑️  RARS EXISTE
> ✅️ 2026-06-25-polinomio_TB.s existe
> ✅️ ../polinomio.s existe
> ✅️ 2026-06-25-mul2u.s existe
> Probando: 2026-06-25-polinomio_TB.s
> Ejecutando: java -jar rars1_6.jar x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 nc me ic 10000 dump 0x10010000-0x10010100 HexText data.hex dump .text HexText text.hex 2026-06-25-polinomio_TB.s ../polinomio.s 2026-06-25-mul2u.s
> ☑️  Hay segmento de datos
> ✅️ Hay segmento de código
  ──────── Salida en consola
* polinomio(1): OK
* polinomio(2): OK
* polinomio(5): OK
* Convenio: OK

  ──────── Resultado
> ✅️ Test 1 OK
> ✅️ Test 2 OK
> ✅️ Test 2 OK
> ✅️ Test convenio OK
────────────────────────────────────────
  • Ejecutamos el script run3.py
────────────────────────────────────────
ARQUI-BOT 0.7
────────────────────────────────────────
> ☑️  RARS EXISTE
> ✅️ ../main2.s existe
> ✅️ 2026-06-25-polinomio_SOL.s existe
> ✅️ 2026-06-25-mul2u.s existe
> Probando: ../main2.s
> Ejecutando: java -jar rars1_6.jar x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 nc me ic 10000 dump 0x10010000-0x10010100 HexText data.hex dump .text HexText text.hex ../main2.s 2026-06-25-polinomio_SOL.s 2026-06-25-mul2u.s
> ✅️ Hay segmento de datos
> ✅️ Hay segmento de código
  ──────── Salida en consola

Evaluando polinomio para x=0 ---> P(x)=1
Evaluando polinomio para x=1 ---> P(x)=3
Evaluando polinomio para x=2 ---> P(x)=7
Evaluando polinomio para x=3 ---> P(x)=13
Evaluando polinomio para x=4 ---> P(x)=21
Evaluando polinomio para x=5 ---> P(x)=31
  ──────── Comprobando cadenas
> ✅️ x=0
> ✅️ P(x)=1
> ✅️ x=1
> ✅️ P(x)=3
> ✅️ x=2
> ✅️ P(x)=7
> ✅️ x=3
> ✅️ P(x)=13
> ✅️ x=4
> ✅️ P(x)=21
> ✅️ x=5
> ✅️ P(x)=31
  ──────── Comprobaciones finales
> ✅️ Se termina con EXIT
> Instrucciones totales: 45
> Ciclos de ejecución: 1561
────────────────────────────────────────

Autores

Licencia

Enlaces

Página principal


Sesiones de Prácticas

P1: Simulador RARs

L1: El simulador RARs
L2: Calculando expresiones
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

SESIONES ADICIONALES

L13: RV32I: Resto de instrucciones
L14: Macros
L15: Entrada/Salida a bajo nivel
L16: Multiplicaciones/divisiones. Unit Tests 🚧
L17: Biblioteca stdio: salida a alto nivel 🚧
Los registros de estado y control (CSR)
Interrupciones y excepciones
Borrador

SOLUCIONES

Soluciones a los ejercicios planteados en cada sesión para practicar:
Sesión L1
Sesión L2
Sesión L3
Sesión L4
Sesión L5
Sesión L6
Sesión L7
Sesión L8
Sesión L9
Sesión L10
Sesión L11
Sesión L12

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
GISAM. Extra. 2025-Jun-17
GISAM. Parcial 1. 2025-Oct-20
GISAM. Parcial 2. 2025-Nov-19
GISAM. Parcial 3. 2026-Enero-9
GISAM. Parcial 1. 2026-Oct-21
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
TELECO. Extra. 2025-Jun-17
TELECO. Parcial 1. 2025-Oct-10
TELECO. Parcial 2. 2025-Nov-13
TELECO. Parcial 3. 2026-Ene-21
TELECO. Extra. 2026-Jun-25
TELECO. Parcial 1. 2026-Oct-09
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
Robótica. Parcial 1. 2025-Feb-25
Robótica. Parcial 2. 2025-Mar-31
Robótica. Parcial 3. 2025-May-19
Robótica. Parcial 1. 2026-Feb-23
Robótica. Parcial 2. 2026-Abr-13
Robótica. Parcial 3. 2026-May-11
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
Datos. Parcial 3. 2025-Ene-17
Datos. Parcial 1. 2025-Oct-15
Datos. Parcial 2. 2025-Nov-19

Clone this wiki locally