Repository navigation
Examen: 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
- Del ejercicio 1:
- Utiliza la plantilla que se proporciona: Plantilla.zip
- Utiliza el fichero so.s proporcionado para las constantes de los servicios del sistema operativo
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:
- Pedir un numero al usuario (a)
- Si
aes un número negativo, saltar al punto 8 - Pedir un segundo número al usuario (b)
- Si
bes un número negativo, saltar al punto 8 - Realizar la multiplicacion:
res = mul2u(a,b) - Mostrar el mensaje
a * b = resen la consola - Repetir desde el punto 1
- 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
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
-
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-
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
ecallDentro 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)
- ...
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:
- Descarga este fichero: arquibot-0.7.zip
- Crea un directorio donde se realizarán las pruebas. Por ejemplo
Extra - Pon en ese directorio tus soluciones. Ficheros:
main1.s,main2.sypolinomio.s, o puedes bajarte los ficheros ya solucionados: main1.s, main2.s, polinomio.s y so.s - 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
────────────────────────────────────────- Juan González-Gómez (Obijuan)


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