Skip to content

L1: Practica 1

javierMaciasGMAIL edited this page Sep 10, 2024 · 106 revisions

Sesión Laboratorio 1: Práctica 1-1

  • Tiempo: 2h
  • Objetivos de la sesión:
    • Toma de contacto con el simulador RARS, para el procesador RISC-V
    • Ejecutar y depurar los programas "hola mundo"
    • Instrucción de suma: addi

Vídeos

Vídeo 1/2: Simulando el "Hola Mundo" con el RARs

Haz click en la imagen para ver el vídeo en Youtube

Click to see the youtube video

Vídeo 2/2: Mi primer programa. Instrucción addi

Haz click en la imagen para ver el vídeo en Youtube

Click to see the youtube video

Contenido

Introducción

En esta asignatura vamos a programar los procesadores RISC-V en lenguaje ensamblador, para entender su funcionamiento y su arquitectura. En las prácticas del laboratorio utilizaremos un simulador que ejecutaremos en el PC. Sin embargo, no hay que perder de vista que estamos programando un procesador, a bajo nivel

Esta es la pinta que tiene un RISC-V, sintetizado en una FPGA Libre. Está ejecutando un programa que realiza una cuenta de 8 bits, que se muestra por los LEDs. La placa usada es la Alhambra II

Los detalles de la implementación del RISC-V en la FPGA no son de esta asignatura, pero si tienes curiosidad e interés, puedes encontrar más información en este repositorio: RISC-V-FPGA (Proyecto en construcción). También en esta sesión de la asignatura de Mecatrónica del Grado de Robótica Software: Procesadores en FPGA: RISC-V

Actividades guiadas

Estas actividades se realizan en vivo. Sigue las indicaciones del profesor. Muchas de las cosas que se mostrarán en vivo también están documentadas aquí, para que las puedas repasar posteriormente o realizar por tu cuenta

Previo: Ver la ventana del profesor

  • Todo lo que realiza el profesor lo puedes ver en el proyector en cualquier momento
  • Sin embargo es más cómodo verlo directamente en tu monitor
  • Profesor: Ejecuta el siguiente comando en el terminal:
share-screen

Para visualizar el escritorio del profesor ejecutar la aplicación visor de escritorio

  • Pincha en el menú superior: Actividades
  • En la caja de búsqueda escribe "Visor": En la izquierda verás el icono: Pínchalo

  • Aparece el visor de escritorio en blanco:

Para conectarte haz lo siguiente:

  • Pincha en Conectar (en la parte superior)
  • Selecciona el protocolo VNC (si no lo estaba ya)
  • Pincha en Buscar: Aparecerán todos los equipos a los que te podrás conectar. Busca uno en el que ponga Escritorio remoto de Obijuan
  • Pincha en Aceptar
  • y por último en Conectar, en la parte inferior derecha

En este GIF animado se resume todo el proceso

¡Ya ves la pantalla del profesor en tu escritorio! Mi recomendación es que dejes la ventana del profesor a tu derecha, a tamaño real y que uses la parte izquierda para trabajar. El escritorio del profesor es de baja resolución, por estar conectado al proyector. De esta forma verás claramente todos los detalles, y no te perderás nada :-)

El tener la ventana de profesor en tu escritorio también te permite tomar pantallazos en cualquier momento (tecla fn + Impr-Pant), o incluso grabar vídeos. ¡Tú decides! :-)

¡Listos para empezar nuestro viaje!

El simulador RARS

En esta asignatura trabajaremos con el procesador RISC-V, aprendiendo a programarlo en ensamblador para comprender su arquitectura interna

Los programas los ejecutaremos en el simulador RARS, que es libre y multiplataforma

Arrancando el simulador

En los laboratorios ya está todo listo para ejecutar el simulador. Pincha en la parte superior en Actividades, teclea rars y pincha en el icono

Nos aparecerá una pantalla como la siguiente

¡Listos para empezar a trabajar!

Arrancando rars desde el terminal de linux

También lo podemos arrancar desde el terminal de Linux. Sólo hay que escribir el comando rars:

Instalando RARs en el ordenador de mi casa

Las últimas versiones del RARs las puedes descargar desde esta página de github. Los vídeos y pantallazos de este curso se hicieron con la versión 1.1. Sin embargo ya van por la versión 1.5, que es la que instalaremos y utilizaremos nosotros

El RARs está programado en Java, y se ejecuta en la máquina virtual de java, por lo que el archivo ejecutable es el mismo para todas las plataformas: linux, Mac o Windows.

Los pasos para la instalación son:

  1. Descargar el rars: rars1_5.jar
  2. Instalar JAVA. Aunque es muy probable que en tu ordenador ya lo tengas instalado
  3. Arrancar RARs
Instalación en Ubuntu 22.04
  • Instala Java 11. Desde un terminal ejecuta:
sudo apt install default-jdk
  • Dar permisos de ejecución al fichero rars.jar que hemos descargado antes y haz doble click. Aparecerá la ventana principal del simulador

  • Otra posibilidad es ejecutarlo desde la terminal, mediante este comando:
java -jar rars.jar
Instalación en Windows 10

Puedes instalar JAVA desde este enlace. Descarga el instalador pinchando en el botón rojo. Se bajará el fichero JavaSetup8u221.exe.

  • Haz doble click para ejecutarlo: es el instalador de JAVA.

  • Pincha en Instalar. Comienza la instalación

  • Al cabo de unos segundos se completará. Pinchamos en Cerrar

  • Localiza el archivo descargado con el RARs

  • Haz doble click para ejecutarlo

¡Ya lo tienes operativo y listo para funcionar!

Probando el "Hola mundo"

Arrancamos el simulador. Todavía NO lo sabemos manejar, ni sabemos nada del procesador RISC-V, pero vamos a ejecutar nuestro primer programa para comprobar que todo está funcionando, y familiarizarnos un poco con el entorno

  • Paso 1: Descargar el fichero en ensamblador con el programa hola mundo: hola_mundo.asm (Pulsar el botón derecho y la opción "Save Link as...")

El programa es este:

#-- Programa hola mundo en RISC-V
#-- Esto son comentarios
	.data
str:	.asciz "Hola mundo en RISC-V!\n"
	
	.text
	
main:	
	
	la a0, str
	li a7, 4   
	ecall
	
	li a7, 10
	ecall	
  • Paso 2: Abrir el fichero desde el entorno

Usando la opción File/Open abrimos el fichero hola_mundo.asm

  • Paso 3: Ensamblamos el programa

Esta acción analiza el programa en ensamblador y genera el código máquina. Esto ya lo veremos, pero el código máquina es el verdadero programa que entiende el procesador, y que se almacena en memoria

Para ensamblar pinchamos en la herramienta Assemble. Si todo ha ido bien, y el programa no tiene errores de sintaxis, se nos cambia automáticamente a la pestaña Execute donde podemos ver el contenido de la memoria (aunque por ahora no entendamos nada)

Podemos volver a la pestaña donde estaba nuestro programa original pinchando en Edit. En la consola en la parte inferior nos aparece un mensaje indicando que el ensamblado se ha realizado correctamente:

Assemble: operation completed successfully.
  • Paso 4: Ejecutar el programa

Para ejecutar el programa pinchamos en el botón de Run en la parte superior. En la parte inferior nos aparecen dos mensajes, uno que lo ha generado nuestro programa, y otro del simulador indicando que el programa se ha terminado de ejecutar

Sí, efectivamente, este programa Hola mundo saca por pantalla la cadena:

Hola mundo en RISC-V!

¡Hemos ejecutado nuestro primer programa en el procesador RISC-V!

  • Paso 5: Volver a ejecutar el programa

Normalmente, para probar nuestros programas tendremos que ejecutarlos varias veces. Para volver a ejecutarlo borramos la consola inferior (opcional) pulsando el botón Clear. A continuación pinchamos en el botón RESET memory and registers, en la parte superior, y volvemos a ejecutar el programa como en el paso anterior

Reto 1: Modificar el texto a imprimir

Todavía no conoces las instrucciones del RISC-V, ni entiendes apenas nada del código del "Hola mundo"... pero... ¿Serías capaz de modificar el programa para que saque por pantalla otra cadena diferente?

Ejecutando el programa "hola mundo" paso a paso

Una ventaja de usar el simulador es que podemos ejecutar las instrucciones paso a paso y entender todo lo que está ocurriendo. Para ejecutar paso a paso hacemos lo siguiente:

  • Desde el editor (pestaña Edit) pinchamos en el botón de ensamblar (igual que antes)

Se resalta en amarillo la primera instrucción. Será la primera que se ejecute

  • Pinchamos en el botón "Run one step at a time", justo a la derecha del botón de ejecutar que ya conocemos. Se ejecuta la instrucción actual y se resalta en amarillo la siguiente. También vemos en la derecha un resaltado en verde: nos indica el registro que se ha modificado

  • Seguimos pulsando el botón anterior hasta que el programa termina

Reto 2

Todavía sabemos muy poco del RISC-V. No sabemos programar ni entendemos las instrucciones... Ejecuta de nuevo el programa hola mundo, paso a paso, y trata de responder las siguientes preguntas:

  • ¿Qué instrucción es la que hace que aparezca el mensaje de texto en la consola?
  • ¿Qué instrucción es la que hace que el programa termine?
  • ¿Sabes cuál es el código máquina de esta instrucción?
  • ¿Cuantos bits tiene esta instrucción?
  • ¿Cuántas instrucciones se ejecuten hasta que el programa termina?
  • ¿Cuál crees que es la dirección donde está situada la primera instrucción?

Registros

El RISC-V que usamos en las prácticas es de 32-bits. En su interior tiene 32 registros de propósito general, de 32-bits. Se numeran desde el 0 al 31 y de forma genérica se denotan por la letra x. Así, el registro x5 es el registro número 5

Los registros se encuentran en la parte derecha del simulador. Podemos ver su número y su valor

El registro x0

El registro x0 es especial. Siempre vale 0 y NO le podemos asignar otro valor. Lo utilizamos para inicializar otros registros a 0, o cuando no queremos alterar otros registros al hacer operaciones de suma

El registro PC: Contador de programa

Además, hay un registro especial llamado PC, que se encuentra abajo del todo. Este registro se denomina contador de programa (program counter) y contiene la dirección de la siguiente instrucción a ejecutar

Arrancamos la ejecución del "hola mundo", paso a paso. Antes de ejecutar ninguna instrucción, el PC tiene la dirección de la primera instrucción

Ejecutamos la instrucción (damos un paso). Ahora el PC tiene la dirección de la siguiente instrucción a ejecutar:

Repetimos el proceso hasta llegar a la última instrucción:

Mostrando los registros en decimal/hexadecimal

Por defecto, los registros los vemos en hexadecimal. Pero lo puedes cambiar a decimal desde el menú, en la opción Settings/Values displayed in hexadecimal

Nuestra primera instrucción: addi

Vamos a estudiar nuestra primera instrucción del RISC-V: addi. Sirve para asignar a un registro la suma de otro registro con una constante. La sintaxis de la instrucción es:

El valor a sumar puede ser positivo o negativo

Estos son algunos ejemplos de utilización:

  • Asignar al registro x3 el valor del registro x2 + 50
addi x3, x2, 50
  • Asignar al registro x4 el valor de x3 - 5
addi x4, x3, -5
  • Incrementar el registro x5. Se usa el propio registro x5 como origen y destino
addi x5, x5, 1
  • Decrementar el registro x5 en dos unidades
addi x5, x5, -2
  • Assignar el valor 30 al registro x6. Usamos el registro 0 para hacer x6 = x0 + 30 = 30 (porque x0 siempre vale 0)
addi x6, x0, 30

Nuestro primer programa

Vamos a escribir nuestro primero programa desde 0. Será muy sencillo. Simplemente asignaremos el valor 30 al registro x3 y terminaremos. El programa se muestra a continuación, pero en vez de hacer copy & paste, vamos a escribirlo directamente en el simulador

Se han incluido explicaciones adicionales para entenderlo mejor

#-- Nuestro primer programa escrito desde cero
#-- Esto que sale en verde son COMENTARIOS
#-- y siempre es lo primero que tenemos que hacer
#-- ¡Somos ingenieros! ¡Hay que documentar!

#-- Programa para asignar el valor 30 al registro x3,
#-- y terminar

	#-- Esto NO es una instruccion. Lo veremos mas
	#-- adelante. Es una Directiva. Se usa para 
	#-- indicar al ensamblador que lo que va a 
	#-- continuacion es codigo
	.text

	#-- Mi primera instruccion
	addi x3, x0, 30   #-- x3 = 0 + 30 = 30
	
	#-- Terminar. Estas instrucciones no saben
	#-- que significan. Lo veremos mas adelante
	#-- Las usamos para terminar el programa y 
	#-- devolver el control al sistema operativo
	li a7, 10
	ecall

Para comenzar a escribir un programa pinchamos en el icono superior izquierdo: "Create a new file for editing"

Se crea una pestaña nueva con el nombre riscv1.asm, que es el nombre que le da el simulador por defecto a los nuevos programas

¡Ya podemos empezar a escribir nuestro primer programa!

Una vez terminado pinchamos en el icono de grabar. Si no lo tenemos grabado no podremos ejecutarlo

Ahora lo ejecutamos paso a paso y comprobamos que efectivamente al ejecutar la instrucción addi el registro x3 cambia su valor a 30 (0x1e en hexadecimal)

Un programa contador

El siguiente programa implementa un contador de 32 bits en el registro x5. Bájalo de este enlace: contador.asm o escríbelo directamente en el simulador

#-- Programa contador
#-- El registro x5 se incrementa indefinidamente

	.text
	
	#-- Inicializar el registro x5 a 0
	addi x5, x0, 0
	
bucle:
	#-- Incrementar el registro x5 en una unidad
	addi x5, x5, 1  #-- x5 = x5 + 1
	
	#-- Repetir indefinidamente		
	b bucle

Este programa no termina nunca. La última instrucción hace que se vuelva a repetir el bucle indefinidamente. Esta instrucción la veremos más adelante

  • Ejecuta el programa paso a paso
  • Observa cómo el registro 5 se incrementa cada vez

Configuramos el simulador para ver los registros en decimal

Si ejecutamos el programa, sin paso a paso, no veremos nada en el registro, porque el programa se ejecuta muy rápido y el simulador no lo refresca. Pero podemos bajar la velocidad de ejecución y entonces sí veremos cómo cuenta

Para terminar pinchamos en el icono de STOP. Esto para la simulación

Recopilación de instrucciones hasta el momento

  • Instrucciones básicas: Son las que se transforman a código máquina y que ejecuta el procesador

Actividades NO guiadas

Estas actividades están pensadas para que las hagas por tu cuenta, sin guía del profesor. Queremos que pienses. Habrá muchas cosas que no sepas, o que no entiendas: investiga, lee, prueba, practica

Recuerda: El objetivo es que aprendas. No tienes que entregar nada

Ejercicio 1

Escribe un programa para RISC-V que asigne los siguientes valores a los registros indicados: x3=3, x4=4, x5=5, x6=6, x7=7 y x8=8. Ejecútalo paso a paso y comprueba que funciona correctamente

Ejercicio 2

Modifica el programa del contador de las actividades guiadas para que se incremente el registro x5 de dos en dos. Ejecútalo paso a paso para comprobar que funciona bien. ¿Cuál es la dirección de la primera instrucción?

Ejercicio 3

Escribe un programa para el RISC-V para que el registro x3 tome los valores 0,1,2,3,4,5..., el x4 0,3,6,9,12,15... y el x5 0,5,10,15,20,25.... indefinidamente. Ejecútalo paso a paso para comprobarlo

Ejercicio 4

Escribe un programa que ejecute las siguientes acciones:

  • Inicializar el registro 6 a 0
  • Restarle 1
  • Terminar ¿Cuál es el valor hexadecimal del registro 6 al terminar el programa?

Ejercicio 5

Ejecuta este código paso a paso. ¿Qué es lo que hace?

	.text
	
	addi x3, x0, 10
a:
	addi x3,x3,-1
	bgt x3,x0, a
	
	li a7, 10
	ecall

Ejercicio 6

Ejecuta este código paso a paso. ¿Qué es lo que hace?

	.text
	
	addi x5, x0, 5
	addi x6, x0, 6
	addi x7, x0, 0
a:
	beq x5,x0,fin
	add x7, x7, x6
	addi x5, x5, -1
	b a
fin:
	li a7, 10
	ecall

Ejercicio 7

El siguiente código NO se ensambla correctamente porque tiene errores. Introdúcelo en el simulador y soluciona los programas para que ensamble correctamente y se pueda ejecutar paso a paso. ¿Qué hace?

        .text

	addi x17, x0, 10
	addi x12, x0, 8
	addii x7, x0, 0
a:
	beq x17,x0,fin  ;-- Comprueba terminacion
	add x7, xx7, x12
	addi x17, x17, -1
	
	;-- repetir 
	
	b hola
	
fin:
	li a7, 10
	ecall

Notas para el profesor

  • Título informal de la clase: "Comienza la aventura..."
  • Nos interesa que tenga una visión física, y de bajo nivel, del computador: La cpu es un chip (que se puede tocar). La memoria también. La E/S en los sistemas empotrados es rudimentaria (ejemplo del contador binario en los LEDs)
  • Para aprender usaremos un simulador, que nos permite "parar el tiempo" y ejecutar instrucciones paso a paso
  • En los sistemas (empotrados) reales el procesador ejecuta millones de instrucciones por segundo. Depurar es un infierno...

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