Examen: 2023_01_10:TELECO - myTeachingURJC/2019-20-LAB-AO GitHub Wiki

Examen convocatoria ordinaria: 2023-01-10. TELECO

  • Tiempo: 2h
  • Tipo de examen: Presencial, en los Laboratorios Linux de la URJC. Entrega realizada a través de Aula Virtual
  • Grado: TELECO
  • Descripción: Enunciado del examen y SOLUCIONES

Contenido

Enunciado

Solución

Pregunta 1: Función doble() (2 puntos)

Está implementada en el fichero doble.s (ESPECIFICACIONES):

#----------------------------------------------------------------
#-- Funcion doble(n): Calcula el doble del numero recibido
#-------------------------------
#-- ENTRADAS:
#--    * a0:  Numero a doblar
#-- SALIDAS:
#--    * a0: Numero doble (2 * a0)
#----------------------------------------------------------------

	.globl doble
	
	.text

doble:

	#-- Es una función hoja, por lo que no hay que guardar la direccion
	#-- de retorno en la pila
	add a0, a0, a0

	ret

Pregunta 2: Programa principal main.s (3 puntos)

Programa principal utilizado para comprobar el funcionamiento de la función anterior (doble()):

Fichero main.s (ESPECIFICACIONES):

#----------------------------------
#-- Programa principal:
#----------------------------------

	.include "so.s"

	.data

	#-- Mensajes indicados en la ESPECIFICACION
msg1: 	.string "Introduzca un numero entero: "
msg2:   .string "El doble de "
msg3:   .string " es "

	.text
	
	#------ Pedir un numero al usuario
	#-- Imprmir los mensajes pedidos (ESPECIFICACION) 
	la a0, msg1
	li a7, PRINT_STRING
	ecall
	
	#-- Lectura del numero entero (n)
	li a7, READ_INT
	ecall
	
	#-- a0 contiene el numero introducido por el usuario
	#-- Lo guardamos en s0 para no perderlo
	mv s0, a0
	
	#-- Calcular el doble del numero
	jal doble
	
	#-- a0 contiene el doble
	mv s1, a0  #-- Guardar el doble en s1
	
	#-- Imprimir el resultado:
	la a0, msg2
	li a7, PRINT_STRING
	ecall
	
	#-- Imprimir el numero original
	mv a0, s0
	li a7, PRINT_INT
	ecall
	
	#-- Imprimir el mensaje 3
	la a0, msg3
	li a7, PRINT_STRING
	ecall
	
	#-- Imprimir el resultado
	mv a0, s1
	li a7, PRINT_INT
	ecall
	
	
	#-- Terminar
	li a7, EXIT
	ecall 

Pregunta 3: Programa principal cuadruple.s (3 puntos)

Fichero cuadruple.s (ESPECIFICACIONES):

#----------------------------------------------------------------
#-- Funcion cuadruple(n): Calcula el cuadruple del numero recibido
#-------------------------------
#-- ENTRADAS:
#--    * a0:  Numero a cuatriplicar
#-- SALIDAS:
#--    * a0: Numero cuatriplicado (4 * a0)
#----------------------------------------------------------------

	.globl cuadruple

	.text
	
	#-- Es una funcion intermecia, por lo que hay que crear la pila
	#-- para guardar la direccion de retorno
cuadruple:

	#-- Crear la pila
	addi sp,sp, -16
	
	#-- Almacenar direccion de retorno 
	sw ra, 12(sp)

	#-- Calcular el doble
	jal doble
	
	#-- En a0 obtenemos el doble
	
	#-- Calcular otra vez el doble
	jal doble
	
	#-- En a0 tenemos el cuadruple
	
	#-- Recuperar la direccion de retorno de la pila
	lw ra, 12(sp)

	#-- Eliminar pila
	addi sp,sp, 16
	ret

Pregunta 4: Programa principal main2.s (2 puntos)

Esta función se encuentra dentro del fichero main2.s (ESPECIFICACIONES)

#----------------------------------
#-- Programa principal:
#----------------------------------

	.include "so.s"

	.data

	#-- Mensajes indicados en la ESPECIFICACION
msg1: 	.string "Introduzca un numero entero: "
msg2:   .string "El cuadruple de "
msg3:   .string " es "

	.text
	
	#------ Pedir un numero al usuario
	#-- Imprmir los mensajes pedidos (ESPECIFICACION) 
	la a0, msg1
	li a7, PRINT_STRING
	ecall
	
	#-- Lectura del numero entero (n)
	li a7, READ_INT
	ecall
	
	#-- a0 contiene el numero introducido por el usuario
	#-- Lo guardamos en s0 para no perderlo
	mv s0, a0
	
	#-- Calcular el doble del numero
	jal cuadruple
	
	#-- a0 contiene el doble
	mv s1, a0  #-- Guardar el doble en s1
	
	#-- Imprimir el resultado:
	la a0, msg2
	li a7, PRINT_STRING
	ecall
	
	#-- Imprimir el numero original
	mv a0, s0
	li a7, PRINT_INT
	ecall
	
	#-- Imprimir el mensaje 3
	la a0, msg3
	li a7, PRINT_STRING
	ecall
	
	#-- Imprimir el resultado
	mv a0, s1
	li a7, PRINT_INT
	ecall
	
	
	#-- Terminar
	li a7, EXIT
	ecall 

Fichero so.s

Según las ESPECIFICACIONES, todas las constantes necesarias para los servicios del sistema operativo se deben situar en el fichero so.s:

#-- Código de los servicios del sistema operativo
#-- Incluir estos archivos en tus programas
#-- para acceder a ellos fácilmente, y hacerlos más
#-- legibles

	
	
	.eqv PRINT_STRING 4
	.eqv READ_STRING  8
	.eqv READ_INT     5
	.eqv PRINT_INT    1
	.eqv PRINT_CHAR   11
	.eqv READ_CHAR    12
	.eqv EXIT         10

Evaluación

TODO

Autores

Licencia

Enlaces