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

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

Licencia

Enlaces