Skip to content

L1: SOLUCIONES

Juan Gonzalez-Gomez edited this page Sep 25, 2025 · 25 revisions

Introducción

Solución a los ejercicios de la Sesión L1

Contenido

Ejercicio 1

(Ver enunciado)
La instrucción para hacer una asignación a un registro es addi, usando como registro fuente el x0

# 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
	ecall

Para 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:

Solución avanzada

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:

# 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
	ecall

El resultado es exactamente el mismo que con la solución anterior

Ejercicio 2

(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

# 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 bucle

Lo 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

Ejercicio 3

(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

# 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 bucle

Al 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

Ejercicio 4

(Ver enunciado)
Las dos acciones que nos piden, inicializar y restar 1, las realizamos con la operacion de suma addi

# 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 ese

Para 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

Ejercicio 5

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

Ejercicio 6

(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

Ejercicio 7

(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 terminacion

Lo 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:

# 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

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