Skip to content

Examen: 2020_07_13:Robótica

Juan Gonzalez-Gomez edited this page Jul 13, 2020 · 3 revisions

Examen convocatoria extraordinaria: 2020-07-13. Ingeniería en Robótica Software

  • Tiempo: 1:30h
  • Descripción: Examen del Laboratorio del grado de Ingeniería en Robótica Software. Convocatoria extraordinaria
  • Fecha: 2020/Julio/13

Contenido

Enunciado

Solución comentada

(Por hacer)

Solución

Como siempre ocurre al programar, existen infinitas soluciones. Pero en todas ellas se debe respetar la especificación y no violar el convenio de uso de registros

Estos son los cuatro ficheros de una posible solución:

  • Fichero sum10.s
	.globl sum10
	
	.text	
#-------------------------------------------------------------------------------------------
#-- sum10: Suma de un conjutno de 10 numeros enteros situados a partir de una posicion de memoria
#-- ENTRADAS:
#--    a0: Puntero al primer numero
#-- SALIDAS:
#--    a0: Resultado de la suma
#-------------------------------------------------------------------------------------------	
sum10:	
	
	#--- t0: Suma acumulada
	li t0, 0
	
	#-- Contador de iteraciones
	li t1, 0
	
bucle:	
	
	# -- Leer numero
	lw t2, 0(a0)
	
	#-- Sumarlo a t0
	add t0,t0, t2
	
	#-- Apuntar al siguiente numero
	addi a0, a0, 4
	
	#-- Incrementar contador de iteraciones
	addi t1, t1, 1
	
	#-- Si contador de iteraciones < 10: repetir
	li t3, 10
	blt t1, t3, bucle
	
	#-- Devolver el resultado
	mv a0, t0
	ret
  • Fichero test-sum10.s
# Realizar la suma de los numeros de cada uno de 
# los dos conjuntos situados en la memoria
	
	#-- Servicios del sistema operativo
	.eqv EXIT 10
	.eqv PRINT_INT 1
	.eqv PRINT_STRING 4
	
	#-- Constante: Numero de conjuntos a los que calcular su suma
	.eqv MAX 2

	.data
	
	#-- Puntero al numero del primer numero del primer conjunto
conjuntos:	
	#-- Primer conjunto de numeros
        .word 100, 50, 288, 99, 3000, 1528, 927, 318, 99, 2020
        
        #-- Segundo conjunto de numeros
        .word 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

msg1:   .string "\nSuma del conjunto de numeros:  "
	
	
	.text
	
	
	#---- s0: Puntero al primer numero del primer conjunto
	la s0, conjuntos
	
	#---- Contador de iteraciones
	#---- Va desde 1 hasta MAX
	li s1, 0
	
	
next:	
	#-- Imprimir mensaje 
	la a0, msg1
	li a7, PRINT_STRING
	ecall
	
	#-- Llamar a sum10(): realizar la suma del conjunto actual
	mv a0, s0
	jal sum10
	
	#-- En a0 tenemos la suma de los numeros
	
	#-- Imprimir resultado en la consola
	li a7, PRINT_INT
	ecall 
	
	#-- El siguiente conjunto de numeros esta situado 10 palabras (40 bytes)
	#-- mas arriba en la memoria. Justo a continuación del anterior conjunto
	addi s0, s0, 40
	
	#-- Incrementar contador de iteraciones
	addi s1, s1, 1
	
	#-- Comprobar si hemos terminado
	li t0, MAX
	blt s1,t0, next
	
	#-- TErminar
	li a7, EXIT
	ecall
  • Fichero usersuma10.s
	.globl usersuma10
	
	.eqv PRINT_STRING 4
        .eqv READ_INT 5
	
	
	.data
msg1:	.string "Introduce numero: "	
	
	.text
#-------------------------------------------
#- Funcion usersum10: Pedir al usuario que introduzca 10 
#- numeros enteros consecutivos, almacenarlos en la memoria y 
#- realizar su suma
#- ENTRADAS:
#-   a0: Puntero para situar los numeros introducidos por el usuario
#- SALIDAS:
#-   a0: Suma de los numeros
#---------------------------------------------------------------	
usersuma10:
	
	#-- Se trata de una funcion intermedia por lo que 
	#-- hay que guardar la direccion de retorno en la pila
	addi sp, sp, -16
	sw ra, 12(sp)
	
		
	#-- t0: Puntero del conjunto de numeros
	mv t0, a0 
	
	#-- Guardar el valor inicial del puntero en la pila, para usarlo
	#-- despues al hacer la suma
	sw a0, 8(sp)
	
	#-- t1: Contador de numeros introducidos
	li t1, 0
	
bucle:	
	#-- Imprimir mensaje
	la a0, msg1
	li a7, PRINT_STRING
	ecall				
	
	#-- Pedir numero al usuario
	li a7, READ_INT
	ecall
	
	
	#-- Guardar numero en la memoria
	sw a0, 0(t0)
	
	# -- Incrementar puntero para apuntar al siguiente numero
	addi t0, t0, 4
	
	#-- Incrementar contador de numeros
	addi t1, t1 , 1
	
	#-- Mientras sea menor a 10, repetimos
	li t2, 10
	blt t1, t2, bucle
	
	#-- Ya estan todos los numeros en la memoria
	#-- Recuperar el puntero inicial del conjunto
	lw a0, 8(sp)
	
	#-- Llamar a sum10() para sumarlos
	jal sum10
	
	#-- En a0 tenemos el resultado de la 
	#-- suma, que se devuelve
		
	#-- Recuperar la direccion de retorno
	lw ra, 12(sp)
	
	#-- Recuperar valor del puntero de pila
	addi sp, sp, 16	
	
	#-- Retornar
		
	ret	
  • Fichero: test-usersuma10.s
	.eqv EXIT        10
	.eqv PRINT_INT    1
	.eqv PRINT_STRING 4
	.eqv PRINT_CHAR   11

	
	.data
	
	#-- Conjunto donde se almacenaran los numeros
	#-- introducidos por el usuario
conjunto: 
        .word 0,0,0,0,0,0,0,0,0,0 	
	

msg2:   .string "\nSuma: "
msg3:   .string "\n\nConjunto de numeros: "
	
	.text
	
	
	la s0, conjunto
	
	#-- Llamar a usersuma10 para pedir los 10 numeros al usuario
	#-- y guardarlos en memoria
	mv a0, s0
	jal usersuma10
	
	#-- s1: Resultado de la suma
	mv s1, a0
	
	#-- Imprimir mensaje 3
	la a0, msg3
	li a7, PRINT_STRING
	ecall 
	
	#------ Recorrer el conjunto de numeros e imprimirlos
	#-- t1: contador de numeros
	li t1, 0
next:	
	#-- Leer numero
	lw t0, 0(s0)
	
	#-- Imprimirlo
	mv a0, t0
	li a7, PRINT_INT
	ecall 
	
	#-- Imprimir un espacio
	li a0, ' '
	li a7, PRINT_CHAR
	ecall 
	
	#-- Incrementar contador de numero
	addi t1, t1, 1
	
	#-- Incrementar puntero
	addi s0, s0, 4
	
	#-- Si t0<10 repetir
	li t2, 10
	blt t1,t2, next
	
	
	# ---- Imprimir la suma total 
	
	#-- Imprimir mensaje
	la a0, msg2
	li a7, PRINT_STRING
	ecall 
	
	
	#-- Imprimir resultado en la consola
	mv a0, s1
	li a7, PRINT_INT
	ecall 
	
	#-- Terminar
	li a7, EXIT
	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 🚧
Macros
Entrada/Salida a bajo 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
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
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
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

Clone this wiki locally