Examen: 2020_07_13:Robótica - myTeachingURJC/2019-20-LAB-AO GitHub Wiki
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
- Aquí está disponible el Enunciado en PDF
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
- Katia Leal Algara
- Juan González-Gómez (Obijuan)