-
Notifications
You must be signed in to change notification settings - Fork 21
Examen: 2019_12_11:GISAM

- Tiempo: 2h
-
Objetivo:
- Resolver el problema de examen de la convocatoria ordinadira de GISAM, con fecha 2019/Dic/11
- Aquí está disponible el Enunciado en PDF
- Animación con un ejemplo del funcionamiento del programa:

TODO
Los cuatro ficheros pedidos son los siguientes:
- Fichero len.s
#------------------------------------------------------------------
#- SUBRUTINA: len(cad)
#-- Calcular la longitud de una cadena
#-- Como final de cadena se usa \0 y \n
#-- ENTRADAS:
#-- a0: Puntero a la cadena
#-- SALIDAS:
#-- a0: Longitud de la cadena
#------------------------------------------------------------------
.globl len
.text
len:
#-- Es una subrutina hoja: no hace falta guardar la direccion de retorno
#-- en la pila (ya está en ra)
#-- Usamos t0 como contador de caracteres
li t0, 0
bucle:
#-- Leer el caracter
lb t1, 0(a0)
#-- Si es 0 terminar
beq t1, zero, fin
#-- Si es '\n', terminar
li t2, '\n'
beq t1, t2, fin
#-- Es un caracter diferente de 0 y '\n'
#-- Incrementar el contador de caracteres
addi t0, t0, 1
#-- Apuntar al siguiente caracter
addi a0, a0, 1
#-- Repetir
b bucle
fin:
#-- Devolver la longitud de la cadena por a0
mv a0, t0
ret- Fichero reverse.s
#-------------------------------------------------------
#-- SUBRUTINA: Reverse(cad)
#--
#-- ENTRADA:
#-- a0: Puntero a la cadena a imprimir al reves
#--
#-- SALIDAS:
#-- Ninguna
#-------------------------------------------------------
.eqv PRINT_CHAR 11
.globl reverse
.text
reverse:
#-- Ultimo nivel: Si la cadena es "'\n'" o ""
lb t0, 0(a0) ### DEBUG: REVERSE
beq t0, zero, terminar
li t1, '\n'
beq t0, t1, terminar
#------- Algoritmo recursivo
#-- Es necesario crear la pila
addi sp, sp, -16
#-- Guardar la direccion de retonro
sw ra, 12(sp)
#-- Guardar el puntero a la cadena actual, para no
#-- perderlo al llamar a reverse
sw a0, 8(sp)
#-- Obtener la subcadena
addi a0, a0, 1
#-- Imprimir la subcadena al reves
jal reverse
#-- Recuperar puntero de la pila
lw a0, 8(sp)
#-- Imprimir el primer caracter
lb a0, 0(a0)
li a7, PRINT_CHAR
ecall
#-- Recuperar la direccion de retorno
lw ra, 12(sp)
#-- Liberar la pila
addi sp, sp, 16
b fin
#-- Ultimo nivel
terminar:
#-- Aqui llega en el ultimo nivel
#-- ESta es una instruccion nula, que se usa para poner un breakpoint
#-- y saber el valor del sp en este último nivel
addi zero, zero, 0 #--- ULTIMO NIVEL
#-- El valor del sp es: 0x7fffefac
fin:
#-- Imprimir la cadena
ret- Fichero procesar.s
#-------------------------------------------------------------------------
#-- SUBRUTINA: Procesar(cad)
#--
#-- Imprimir a longitud de la cadena y la cadena al revés
#-- Para obtener la longitud se invoca a la funcion len()
#-- Para imprimir del revés se llama a la función reverse()
#--
#-- ENTRADAS:
#-- a0: Puntero a la cadena a procesar
#--
#-- SALIDAS:
#-- Ninguna
#------------------------------------------------------------------------
.globl procesar
.eqv PRINT_STRING 4
.eqv PRINT_INT 1
.data
msg1: .string "\nLongitud cadena: "
msg2: .string "\nCadena invertida: "
.text
procesar:
#-- Es una funcion intermedia
#-- Hay que crear la pila para guardar la direccion de retorno
addi sp, sp, -16
#-- Guardar la direccion de retorno
sw ra, 12(sp)
#-- Almacenar la direccion de la cadena para no perderla
sw a0, 8(sp)
#---- Imprimir mensaje 1
la a0, msg1
li a7, PRINT_STRING
ecall
#------ Calcular la longitud de la cadena, llamandando a la funcion len()
lw a0, 8(sp)
jal len
#-- Imprimir la longitud
li a7, PRINT_INT
ecall
#--- Imprimir mensaje 2
la a0, msg2
li a7, PRINT_STRING
ecall
#-- Recuperar el puntero de la cadena
lw a0, 8(sp)
#-- Imprimir la cadena invertida
jal reverse
#-- Recuperar la direccion de retorno
lw ra, 12(sp)
#-- Liberar la pila
addi sp, sp, 16
ret- Fichero: main.s
#----- PROGRAMA PRINCIPAL
#-- Servicios del sistema operativo
.eqv EXIT 10
.eqv PRINT_STRING 4
.eqv READ_STRING 8
.eqv MAX 100
.data
msg1: .string "\n\nIntroduce cadena: "
cad: .space MAX
.text
#-- Repetir el bucle hasta que se introduzca la cadena nula "\n"
#-- (Pulsar enter sin introducir nada)
bucle:
#-- Imprimir mensaje 1
la a0, msg1
li a7, PRINT_STRING
ecall
#-- Pedir cadena al usuario
la a0, cad
li a1, MAX
li a7, READ_STRING
ecall
#-- Si el primer caracter es '\n' terminar
lb t0, 0(a0)
li t1, '\n'
beq t0, t1, fin
#-- Llamar a la funcion de procesar
la a0, cad
jal procesar
#-- Repetir
b bucle
fin:
#--- Terminar
li a7, EXIT
ecall- Katia Leal Algara
- Juan González-Gómez (Obijuan)


L1: El simulador RARs
L2: Calculando expresiones
L3: Práctica 1-3. Variables
L4: Pract 2-1. E/S mapeada
L5: Práctica 2-2: Inst. ecall
L6: Prác 2-3: Cadenas
L7: Práct 3-1: Bucles y saltos
L8: Práct 3-2: Cadenas II
L9: Pract 4-1: Subrut. Nivel-1
L10: Pract 4-2: La pila
L11: Pract 4-3: Recursividad
L12: Pract 5-1. Heap. Listas
L13: RV32I: Resto de instrucciones 🚧
Macros
Entrada/Salida a bajo nivel
Los registros de estado y control (CSR)
Interrupciones y excepciones
Borrador
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
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