Repository navigation
L1: SOLUCIONES
Solución a los ejercicios de la Sesión L1
- Ejercicio 1
- Ejercicio 2
- Ejercicio 3
- Ejercicio 4
- Ejercicio 5
- Ejercicio 6
- Ejercicio 7
- Autores
- Licencia
- Enlaces
(Ver enunciado)
La instrucción para hacer una asignación a un registro es addi, usando como registro fuente el x0
- Fichero: L1-sol-01.s
# Sesion L1
# Solucion al ejercicio 1
#
#-- Asignar los siguientes valores a los registro indicados:
#-- x3=3, x4=4, x5=5, x6=6, x7=7 y x8=8
.text
addi x3, x0, 3 # x3 = 3
addi x4, x0, 4 # x4 = 4
addi x5, x0, 5 # x5 = 5
addi x6, x0, 6 # x6 = 6
addi x7, x0, 7 # x7 = 7
addi x8, x0, 8 # x8 = 8
#-- Terminar
li a7, 10
ecallPara comprobar que el programa funciona lo ensamblamos y lo ejecutamos paso a paso. Vemos cómo los registros del x3 al x8 toman los valores del 3 al 8 respectivamente. Una vez ejecutado el programa completo, esto es lo que vemos en el simulador:

En la sesión 3 aprendemos que estas mismas asignaciones las podemos hacer con la pseudo-instrucción li. Es el programa ensamblador el que la convierte en la instrucciónn addi equivalente. El programa sería:
- Fichero: L1-sol-01-bis.s
# Sesion L1
# Solucion al ejercicio 1 (avanzada)
#
#-- Asignar los siguientes valores a los registro indicados:
#-- x3=3, x4=4, x5=5, x6=6, x7=7 y x8=8
#--
#-- La operación de asignacion se realiza tipicamente con
#-- la pseudo-instruccion li, que no vemos hasta la sesion L3
#-- El programa es equivalente, pero usando li en vez de addi
#-- (pero genera exactamente las mismas instrucciones basicas)
.text
li x3, 3 # x3 = 3
li x4, 4 # x4 = 4
li x5, 5 # x5 = 5
li x6, 6 # x6 = 6
li x7, 7 # x7 = 7
li x8, 8 # x8 = 8
#-- Terminar
li a7, 10
ecallEl resultado es exactamente el mismo que con la solución anterior
(Ver enunciado)
Para que el contador cuente de 2 en 2 basta con sustituir la instrucción addi x5, x5, 1 por addi x5, x5, 2. De esta forma en cada vuelta del bucle se realizará la operación x5 = x5 + 2, en vez de x5 = x5 + 1. Para inicializar el registro x5 a 0 utilizamos addi x5, x0, 0
- Fichero: L1-sol-02.s
# Sesion L1
# Solucion al ejercicio 2
# --- Programa contador
# --- Se implementa un contador en el registro x5
# --- que se ejecuta indefinidamente
# --- El contador se inicializa con el valor 0
# --- El contador se incrementa de 2 en 2
.text
#-- Inicializar contador
addi x5, x0, 0 #-- x5 = 0
# -- Repetir indefinidamente las siguientes
# -- instrucciones
bucle:
#-- Incrementar contador en 2 unidades
addi x5, x5, 2
#-- Repetir!
j bucleLo simulamos para comprobar que funciona correctamente. Nos fijamos en el registro x5: Efectivamente sólo toma los valores pares

La dirección de la primera instrucción la vemos directamente en la columna address. Su valor es: 0x00400000

(Ver enunciado)
Partimos del ejemplo del contador. Es la misma estructura. Sólo hay que inicializar los tres regisros a cero y añadir los incrementos en el bucle
- Fichero: L1-sol-03.s
# Sesion L1
# Solucion al ejercicio 3
# El registro x3 toma los valores 0,1,2,3,4,5... (Incremento de 1)
# El x4: 0,3,6,9,12,15... (Incremento de 3 en 3)
# El x5 0,5,10,15,20,25.... (Incremento de 5 en 5)
#-- Se repite indefinidamente
.text
#-- Inicializar los registros a 0
addi x3, x0, 0
addi x4, x0, 0
addi x5, x0, 0
bucle:
#-- Incrementar x3 en una unidad
addi x3, x3, 1
#-- Incrementar x4 en 3 unidades
addi x4, x4, 3
#-- Incrementar x5 en 5 unidades
addi x5, x5, 5
#-- Repetir indefinidamente
j bucleAl simularlo comprobamos que efectivamente está funcionando correctamente. El registro x3 se incrementa de uno en uno, empezando en 0. El x4 de 3 en 3, también empezando desde cero. Y el x5 de 5 en 5, comenzando por 0

(Ver enunciado)
Las dos acciones que nos piden, inicializar y restar 1, las realizamos con la operacion de suma addi
- Fichero: L1-sol-04.s
# Solucion al ejercicio 4
# programa que ejecute las siguientes acciones:
# * Inicializar el registro 6 a 0
# * Restarle 1
# * Terminar
.text
#-- Inicializar registro 6 a 0
addi x6, x0, 0
#-- Restar 1
addi x6, x6, -1
#-- Terminar
li a7, 10
ecall
#-- configuramos para ver los registros en hexadecimal
#-- Al restar 1 a 0, x6 vale 0xFFFFFFFF (todos los bits a 1)
#-- El valor en complemento a dos de -1 es justo esePara entender mejor el valor de x6 al restar 1, activamos la opción de ver los registros en hexadecimal y observamos que vale 0xFFFFFFFF (todos los bits a 1). Este es el valor de -1 en complemento a dos

(Ver enunciado)
Se trata de una cuenta atrás. El registro x3 comienza en 10, se va decrementando hasta llegar a 0, y termina

(Ver enunciado)
Este programa implementa la multiplicación de dos registros, utilizando sumas. En los registros x5 y x6 se introducen los dos números a multiplicar. El resultado se devuelve en x7
La operación realizada es por tanto: x7 = x5 * x6
Al ejecutar el programa obtenemos que x7 = 5 * 6 = 30

(Ver enunciado)
El objetivo de este ejercicio es familiarizarnos con los mensajes de error del ensamblador. Muchas veces al producirse un error es difícil encontrar a qué es debido
Al introducir el programa en el simulador y ensamblarlo, obtenemos este primer error:

Es debido a una errata en los comentarios. En vez del símbolo #, se ha introducido ;. La línea correcta sería esta:
beq x17,x0,fin #-- Comprueba terminacionLo solucionamos y volvemos a ensamblar. Ahora aprece un segundo error. Lo examinamos y vemos que ha ocurrido lo mismo que antes. Hay otro comentario incorrecto. En los ensambladores de otros microprocesadores el símbolo ; se utiliza para introducir comentarios, pero en el RISC-V se usa #

El siguiente error es una errata al escribir la instrucción addi. La última i se ha duplicado

En la línea 8 hay otra errata. La x del registro x7 se ha duplicado

El último error es por la utilización de una etiqueta NO definida: hola. Debería ser a

Ahora lo podemos simular y comprobar qué es lo que hace: calcula los múltiplos de 8, en el registro x7. Saca 10 múltiplos, por lo que en realidad es la tabla de multiplicar del 8

Este es el programa completo, sin errores de ensamblado:
- Fichero: L1-sol-07.s
# Sesion L1
# Solucion al ejercicio 7
# Ensambla este programa y soluciona los errores que tenga
# Consigue que se pueda ejecutar paso a paso
# -- Este codigo tiene todos los errores solucionados
.text
addi x17, x0, 10
addi x12, x0, 8
addi x7, x0, 0
a:
beq x17,x0,fin #-- Comprueba terminacion
add x7, x7, x12
addi x17, x17, -1
#-- repetir
j a
fin:
li a7, 10
ecall- Juan González-Gómez (Obijuan)
- Katia Leal Algara
- Miguel Ángel de Miguel Paraíso
- Javier Macias del Campo
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