Examen: 2020_06_01:Robótica - myTeachingURJC/2019-20-LAB-AO GitHub Wiki
Examen convocatoria ordinaria: 2020-06-01. Ingeniería en Robótica Software
- Tiempo: 1:30h
- Descripción: Examen del Laboratorio del grado de Ingeniería en Robótica Software. Convocatoria ordinaria
- Fecha: 2020/Junio/01
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 replace.s
.globl replace
.text
#-------------------------------------------
#-- replace(pcad, c_org, c_remp)
#-- Funcion para reemplazar el caracter c_orig por c_remp en la cadena
#-- apuntada por pcad
#--
#-- ENTRADAS:
#-- * a0: pcad: Puntero a la cadena
#-- * a1: c_org: caracter original
#-- * a2: c_remp: Caracter a reemplazar
#..
#-- SALIDAS:
#-- Ninguna
#------------------------------------------
replace:
#-- Es una funcion hoja: no hay que guardar la direccion
#-- de retorno: no es necesario guardar ra en la pila
#-- Tampoco necesitamos la pila para otra cosa
#-- Leer siguiente caracter
next:
lb t0, 0(a0)
#-- Es el final de la cadena?
beq t0, zero, fin # Si --> Terminar
#-- Es el caracter igual al original?
bne t0, a1, incrementar #-- No, pasar al sigueinte
#-- Si, reemplazarlo por el nuevo
sb a2, 0(a0)
incrementar:
#-- NO: apuntar al siguiente caracter
addi a0, a0, 1
#-- Repetir bucle
b next
fin:
ret
- Fichero test_replace.s
#-------------------------------------------------------------------
#-- test_replace.s: Programa para probar la funcion replace
#-------------------------------------------------------------------
# -- Servicios del sistema operativo
.eqv PRINTSTRING 4
.eqv EXIT 10
.data
#-- Cadenas de pruebas
test1: .string "=== Prueba 1 ===\n"
test2: .string "Abracadabra\n"
.text
#-- Imprimir la primera cadena de prueba
la a0, test1
li a7, PRINTSTRING
ecall
#-- Reemplazar los caracteres '=' por '*'
li a1, '='
li a2, '*'
jal replace
#-- Imprimir la cadena reemplazada
la a0, test1
li a7, PRINTSTRING
ecall
#--------- Prueba con la segunda cadena
#-- Imprimir la cadena reemplazada
la a0, test2
li a7, PRINTSTRING
ecall
#-- Reemplazar las aes por '-'
li a1, 'a'
li a2, '-'
jal replace
#-- Imprimir la cadena reemplazada
la a0, test2
li a7, PRINTSTRING
ecall
#-- Exit
li a7, 10
ecall
- Fichero replace_vowels.s
.globl replace_vowels
.text
#-------------------------------
#- replace_vowels(pcad, car)
#- pcad: a0: Puntero a la cadena a sustituir las vocales
#- car: a1: Caracter a usar de reemplazo para TODAS las volcales
#------------------------------
replace_vowels:
#-- Se trata de una funcion intermedia
#-- Es necesario usar la pila para guardar la direccion de retorno
addi sp, sp, -16
#-- Guardar la direcion de retorno
sw ra, 12(sp)
#-- Guardamos en la pila el puntero a la cadena
#-- y el caracter. Es necesario para NO violar el
#-- convenio, ya que al llamar a una función los
#-- perdemos
sw a0, 0(sp) #-- Posicion 0: Puntero a la cadena
sw a1, 4(sp) #-- Posicion 4: Caracter
#-- Ahora solo tenemos que llamar consecutivamente a las funciones de
#-- replace para sustituir cada vocal por el caractere de reemplazo:
#--
#-- replace(pcad, 'a', car)
#-- replace(pcad, 'e', car)
#-- replace(pcad, 'i', car)
#-- repalce(pcad, 'o', car)
#-- replace(pcad, 'u', car)
#-- Para no violar el convenio, los valores de
#-- a0 y a2 (pcad, y car) los leemos de la pila
#------------ Reemplazar la vocal a
lw a0, 0(sp) # a0: puntero a la cadena
li a1, 'a' #
lw a2, 4(sp) # a2: Caracter de reemplazo
jal replace
#------------ Reemplazar la vocal e
lw a0, 0(sp) # a0: puntero a la cadena
li a1, 'e' #
lw a2, 4(sp) # a2: Caracter de reemplazo
jal replace
#------------ Reemplazar la vocal i
lw a0, 0(sp) # a0: puntero a la cadena
li a1, 'i' #
lw a2, 4(sp) # a2: Caracter de reemplazo
jal replace
#------------ Reemplazar la vocal o
lw a0, 0(sp) # a0: puntero a la cadena
li a1, 'o' #
lw a2, 4(sp) # a2: Caracter de reemplazo
jal replace
#------------ Reemplazar la vocal u
lw a0, 0(sp) # a0: puntero a la cadena
li a1, 'u' #
lw a2, 4(sp) # a2: Caracter de reemplazo
jal replace
#-- Recuperar la direccion de retorno
lw ra,12(sp)
#-- Recuperar la pila
addi sp, sp, 16
ret
- Fichero: main.s
# -- Servicios del sistema operativo
.eqv PRINTSTRING 4
.eqv EXIT 10
.data
#-- Cadenas de prueba
cad1: .string "===> a e i o u <===\n"
cad2: .string "Cuando Fernando Septimo usaba paleto\n"
.text
#------------- TEST 1
# -- Imprimir la cadena original
la a0, cad1
li a7, PRINTSTRING
ecall
# -- Lllamar a replace_vowels
la a0, cad1
li a1, '*'
jal replace_vowels
# -- Imprimir la cadena reemplazada
la a0, cad1
li a7, PRINTSTRING
ecall
#--------------- TEST 2
# -- Imprimir la cadena original
la a0, cad2
li a7, PRINTSTRING
ecall
# -- Lllamar a replace_vowels
la a0, cad2
li a1, 'a'
jal replace_vowels
# -- Imprimir la cadena reemplazada
la a0, cad2
li a7, PRINTSTRING
ecall
#-- Exit
li a7, 10
ecall
Autores
- Katia Leal Algara
- Juan González-Gómez (Obijuan)