Examen: 2022_01_10:TELECO GISAM - myTeachingURJC/2019-20-LAB-AO GitHub Wiki
Examen convocatoria ordinaria: 2022-01-10. TELECO-GISAM
- Tiempo: 2h
- Tipo de examen: Presencial, en los Laboratorios Linux de la URJC. Entrega realizada a través de Aula Virtual
- Grados: El examen fue el mismo para los grados de GISAM y TELECO
- Objetivo:
- Resolver el problema de examen de la convocatoria ordinadira de GISAM, con fecha 10/Enero/2022
Contenido
Enunciado
- Aquí está disponible el Enunciado:
- Teleco: Enunciado en PDF
- Gisam: Enunciado en PDF
- Esta es las plantilla proporcionada: Plantilla.zip. Contiene los ficheros que hay que entregar
Solución
Pregunta 1: Función printbin()
Está implementada en el fichero printbin.s:
#-------------------------------------------
# PrintBin(num)
# Entradas:
# a0: Numero a imprimir en binario
# Devuelve:
# nada
#-------------------------------------------
.eqv PRINT_CHAR 11
.eqv PRINT_BIN 35
.globl printbin
.text
printbin:
#-- Es una funcion hoja. No es necesario guardar
#-- la direccion de retorno en la pila
# -- ESPECIFICACION ENUNCIADO: Imprimir numero en binario
# -- mediante una llamada al sistema
li a7, PRINT_BIN
ecall
# -- ESPECIFICACION ENUNCIADO: Imprimir Salto de linea
li a0, '\n'
li a7, PRINT_CHAR
ecall
# --
#-- Retornar
ret
Pregunta 2: Programa de prueba test_printbin.s
Programa principal utilizado para comprobar el funcionamiento de la función anterior (printbin()):
Fichero test_printbin.s:
# -- Constantes para los servicios del sistema operativo
# -- ESPECIFICACION DEL ENUNCIADO: Deben estar en el propio fichero
.eqv EXIT 10
.eqv PRINT_INT 1
.eqv PRINT_STRING 4
# -- Constantes indicadas en el enunciado (ESPECIFICACION)
# -- No definir estas constatnes es una violación de las especificaciones
.eqv VAL_INI 255 #-- Numero inicial
.eqv VAL_FIN 265 #-- Numero final
.data
#-- Mensaje a imprimir en la salida (ESPECIFICACIONES)
msg: .string "--> "
.text
#-- Se utiliza el registro estatico s0
#-- como contador, para no perder su valor
#-- al llamar a la funcion printbin
# -- ESPECIFICACION ENUNCIADO: Valor inicial
# -- No se puede usar un registro temporal, ya que al llamar a la función
# -- se pierde su valor
li s0, VAL_INI
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 binario llamando a la funcion printbint
mv a0, s0
jal printbin
# -- Incrementar el numero
addi s0, s0, 1
# -- Mientras s0 sea menor o igual que VAL_FIN repetir el bucle
li t1,VAL_FIN
ble s0, t1, bucle
#-- Terminar
li a7, EXIT
ecall
Pregunta 3: Programa principal dec2bin.s (2.5 puntos)
Fichero dec2bin.s:
# -- Constantes (ESPECIFICACIONES DEL ENUNCIADO)
.eqv EXIT 10
.eqv PRINT_INT 1
.eqv PRINT_STRING 4
.eqv READ_INT 5
.data
# -- Mensajes a imprimir (ESPECIFICACIONES DEL ENUNCIADO)
msg1: .string "\nIntroduce numero en decimal: "
msg2: .string "\nValor en binario: "
num: .word 0
.text
bucle:
# -- ESPECIFICACIÓN: 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
# -- ESPECIFICACIÓN: Si el numero es 0, terminar
beq a0, zero, fin
# -- Guardar resultado en t0
mv t0, a0
# -- ESPECIFICACIÓN: Imprimir mensaje 2
la a0, msg2
li a7, PRINT_STRING
ecall
#-- ESPECIFICACIÓN: Imprimirlo en binario
mv a0, t0
jal printbin
# ESPECIFICACIÓN: Debe estar en un bucle
# Repetir el bucle
b bucle
fin:
#-- Terminar
li a7, EXIT
ecall
Pregunta 4: Función test_printbin() (2 puntos)
Esta función se encuentra dentro del fichero test_printbin2.s
¡¡OJO!!: Mucha atención a los nombres de las funciones y los nombres de los ficheros. Si los cambias, aunque sólo sea por un carácter, ya no se pueden compilar con el resto de programas. La función pedida es test_printbin(), en el fichero test_printbin2.s. Los detalles son muy importantes
# -- Constantes (ESPECIFICACIÓN)
.eqv PRINT_INT 1
.eqv PRINT_STRING 4
# -- Constantes indicadas en el enunciado (ESPECIFICACION)
.eqv VAL_INI 255 #-- Numero inicial
.eqv VAL_FIN 265 #-- Numero final
# -- ESPECIFICACION: Nombre de la funcion
.globl test_printbin
.data
msg: .string "--> "
.text
test_printbin:
# -- 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 el registro S0 para no violar
# -- el convenio
sw s0, 0(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, VAL_INI
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 binario
mv a0, s0
jal printbin
# -- Incrementar el numero
addi s0, s0, 1
# -- Mientras s0 sea menor que VAL_FIN repetir el bucle
li t1, VAL_FIN
ble s0, t1, bucle
# ------------------ Hasta aqui mismo codigo que problema 2 ------------
# -- Recuperar el valor de S0
lw s0, 0(sp)
# -- Recuperar direccion de retorno de la pila
lw ra, 12(sp)
# -- Recuperar el valor original del sp
addi sp, sp, 16
#-- Retornar
ret
Pregunta 5: Programa principal main.s (0.5 puntos)
Fichero main.s:
¡¡OJO!!: Sólo se pide llamar 2 veces seguidas a la función test_printbin(). Se pide imprimir ni saltos de línea ni nada más
.eqv EXIT 10
.text
# -- Llamar a la funcion pedida dos veces
jal test_printbin
jal test_printbin
# -- Terminar
li a7, EXIT
ecall
Autores
- Katia Leal Algara
- Juan González-Gómez (Obijuan)