Examen: 2021_05_20:Robótica - myTeachingURJC/2019-20-LAB-AO GitHub Wiki
Examen convocatoria ordinaria: 2021-05-20. Ingeniería en Robótica Software
- Tiempo: 2h
- Descripción: Examen del Laboratorio del grado de Ingeniería en Robótica Software. Convocatoria extraordinaria
- Fecha: 2021/Mayo/20
Contenido
Enunciado
- Aquí está disponible el Enunciado en PDF
- Aquí están las Plantillas: Plantillas.zip
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 printhex.s
#-------------------------------------------
# PrintHex(num)
# Entradas:
# a0: Numero a imprimir en hexadecimal
# Devuelve:
# nada
#-------------------------------------------
# -- Servicios del Sistema Operativo
.eqv PRINT_CHAR 11
.eqv PRINT_HEX 34
.globl printhex
.text
printhex:
# -- Imprimir numero en hexadecimal
li a7, PRINT_HEX
ecall
# -- Imprimir Salto de linea
li a0, '\n'
li a7, PRINT_CHAR
ecall
#-- Retornar
ret
- Fichero test_printhex.s
# -- Constantes
.eqv EXIT 10
.eqv PRINT_INT 1
.eqv PRINT_STRING 4
.data
msg: .string ": "
.text
#-- Se utiliza el registro estatico s0
#-- como contador, para no perder su valor
#-- al llamar a la funcion printhex
# -- ESPECIFICACION ENUNCIADO: Valor inicial
li s0, 10
# -- Valor usado para repetir el bucle
# -- y obtener los numeros del 10 al 15
li s1, 16
bucle:
# -- ESPECIFICACION ENUNCIADO: Imprimir el numero en decimal
mv a0, s0
li a7, PRINT_INT
ecall
# -- ESPECIFICACION ENUNCIADO: Imprimir cadena ": "
la a0, msg
li a7, PRINT_STRING
ecall
# -- ESPECIFICACION ENUNCIADO: Imprimir en hexadecimal
mv a0, s0
jal printhex
# -- Incrementar el numero
addi s0, s0, 1
# -- Mientras s0 sea menor que 16 repetir el bucle
blt s0, s1, bucle
#-- Terminar
li a7, EXIT
ecall
- Fichero conversor.s
# -- Constantes
.eqv EXIT 10
.eqv PRINT_INT 1
.eqv PRINT_STRING 4
.eqv READ_INT 5
.data
msg1: .string "\nIntroduce numero en decimal: "
msg2: .string "\nValor en hexadecimal: "
num: .word 0
.text
bucle:
# -- Pedir cadena al usuario
la a0, msg1
li a7, PRINT_STRING
ecall
li a7, READ_INT
ecall
#-- a0 contiene el número introducido por el usuario
# -- Si el numero es 0, terminar
beq a0, zero, fin
# -- Guardar resultado en t0
mv t0, a0
# -- Imprimir mensaje 2
la a0, msg2
li a7, PRINT_STRING
ecall
#-- Imprimirlo en hexadecimal
mv a0, t0
jal printhex
# Repetir el bucle
b bucle
fin:
#-- Terminar
li a7, EXIT
ecall
- Fichero test_printhex2.s
# -- Constantes
.eqv PRINT_INT 1
.eqv PRINT_STRING 4
.globl test_printhex
.data
msg: .string ": "
.text
test_printhex:
# -- Es una funcion intermedia, por lo que reservamos espacio
# -- en la pila para guardar la direccion de retorno
addi sp, sp, -16
# -- Guardar direccion de retorno
sw ra, 12(sp)
# -- Guardar registros estaticos
# -- para no violar el convenio
sw s0, 0(sp)
sw s1, 4(sp)
# ---------------------------------- Mismo codigo que problema 2 -------------
#-- Se utiliza el registro estatico s0
#-- como contador, para no perder su valor
#-- al llamar a la funcion printhex
# -- ESPECIFICACION ENUNCIADO: Valor inicial
li s0, 10
# -- Valor usado para repetir el bucle
# -- y obtener los numeros del 10 al 15
li s1, 16
bucle:
# -- ESPECIFICACION ENUNCIADO: Imprimir el numero en decimal
mv a0, s0
li a7, PRINT_INT
ecall
# -- ESPECIFICACION ENUNCIADO: Imprimir cadena ": "
la a0, msg
li a7, PRINT_STRING
ecall
# -- ESPECIFICACION ENUNCIADO: Imprimir en hexadecimal
mv a0, s0
jal printhex
# -- Incrementar el numero
addi s0, s0, 1
# -- Mientras s0 sea menor que 16 repetir el bucle
blt s0, s1, bucle
# ------------------ Hasta aqui mismo codigo que problema 2 ------------
# -- Recuperar el valor de S0 y s1
lw s0, 0(sp)
lw s1, 4(sp)
# -- Recuperar direccion de retorno de la pila
lw ra, 12(sp)
# -- Recuperar el valor original del sp
addi sp, sp, 16
#-- Retornar
ret
- Fichero main.s
.eqv EXIT 10
.text
# -- Llamar a la funcion pedida dos veces
jal test_printhex
jal test_printhex
# -- Terminar
li a7, EXIT
ecall
Autores
- Katia Leal Algara
- Juan González-Gómez (Obijuan)