Skip to content

Examen: Parcial 3:2023_12_20:Datos

Miguel edited this page Jan 10, 2024 · 1 revision

Examen Parcial 3: 2023-05-20. Ingeniería de Datos

  • Tiempo: 55 minutos
  • Descripción: Examen Parcial 3. Laboratorio. Grado de Ingeniería en Ciencia de Datos
  • Temario: Sesiones L9, L910 y L11

Contenido

Enunciado

Escribir un programa que pida al usuario dos números enteros a y b, y calcule la potencia a^b con un algoritmo recursivo. El programa constará de un código principal y dos subrutinas. La primera subrutina (pedir_int.asm) imprimirá un mensaje por pantalla y pedirá un número entero. Tendrá como parámetros de entrada la dirección de memoria de la cadena del mensaje a imprimir, y devolverá el entero leido. La segunda subrutina (exp.asm) calcula la potencia a^b. Tendrá como entrada los valores a y b, y devolverá el resultado de calcular a^b. Esta función se debe implementar de acuerdo al siguiente algoritmo recursivo, descrito en pseudocódigo python:

def exp(a, b):

    if b < 1:

        return 1

    return  exp(a, b-1) * a

Las subrutinas deben estar en ficheros separados al programa principal.

Recuerda comprobar que no se incumple el convenio de uso de los registros.

Los nombres de los ficheros a implementar son potencia.asm para el programa principal, exp.asm para la subrutina exp y pedir_int.asm para la subrutina que pide un entero. Recuerda subir también los archivos que utilices en tu código con la directiva .include

Solución

  • Fichero potencia.asm
#-- Programa que realiza una potencia de manera recursiva
#-- Pide por teclado dos enteros y llama a la funcion exp(a, b),
#--   que devuelve el resultado de a^b


	.include "lib.asm"

	.data
	
msg1:	.string "Introduce base: "
msg2:	.string "Introduce exponente: "
msg3:	.string "El resultado es: "

	.text
	
	#-- Imprimir "Introduce base: "
	la a0, msg1
	jal pedir_int
	mv s0, a0
	
	
	#-- Imprimir "Introduce exponente: "
	la a0, msg2
	jal pedir_int
	
	#-- Calcular exponente con la subrutina exp
	mv a1, a0
	mv a0, s0
	jal exp
	mv s2, a0
	
	
	#-- Imprimir "El resultado es: "
	la a0, msg3
	li a7, PRINT_STRING
	ecall
	
	#-- Imprimir resultado
	mv a0, s2
	li a7, PRINT_INT
	ecall
	
	#-- Fin
	li a7, EXIT
	ecall
  • Fichero pedir_int.asm
#-- Subrutina que muestra un mensaje por pantalla
#-- y pide por teclado un número entero
#-- Argumentos:
#-- 	a0 = puntero a la cadena del mensaje
#-- Resultado:
#--	a0 = entero pedido por teclado

	.include "lib.asm"

	.globl pedir_int

	.text
	
pedir_int:
	
	#-- Mostramos el mensaje apuntado por a0
	li a7, PRINT_STRING
	ecall
	
	#-- Pedimos un entero por pantalla
	li a7, READ_INT
	ecall
	
	#-- Salida de la subrutina
	ret
  • Fichero exp.asm
#-- Subrutina que calcula de forma recursiva una potencia
#-- exp(a, b) devuelve el resultado de hacer a^b
#-- Argumentos:
#-- 	a0 = base (a)
#-- 	a1 = exponente (b)
#-- Resultado:
#--	a0 = a^b

	.globl exp

	.text
	
	#-- Punto de entrada
exp:
	#-- if a1 < 1
	li t0, 1
	bge a1, t0, exp_rec
	
	#-- return 1
	li a0, 1
	b fin
	
	
exp_rec:
	#-- Reserva de 16 bytes en la pila
	addi sp, sp, -16
	
	#-- Guardado de dirección de retorno
	sw ra, 12(sp)
	
	#-- Guardado de base
	sw a0, 8(sp)
	
	#-- llamada a exp(a, b-1)
	addi a1, a1, -1
	jal exp
	
	#-- Recuperación de base
	lw t0, 8(sp)
	
	#-- result = exp(a, b-1) * a
	mul a0, a0, t0
	
	#-- Recuperación de dirección de retorno
	lw ra, 12(sp)
	
	#-- Liberación de 16 bytes en la pila
	addi sp, sp, 16


fin:
	#-- salida de la subrutina
	ret
  • Fichero lib.asm
	.eqv EXIT 10
	.eqv PRINT_INT    1
	.eqv READ_INT     5
	.eqv PRINT_STRING 4

Autores

Licencia

Enlaces

Página principal


Sesiones de Prácticas

P1: Simulador RARs

L1: El simulador RARs
L2: Calculando expresiones
L3: Práctica 1-3. Variables

P2: E/S mapeada. Llamadas al sistema

L4: Pract 2-1. E/S mapeada
L5: Práctica 2-2: Inst. ecall
L6: Prác 2-3: Cadenas

P3: Bucles y Saltos condicionales

L7: Práct 3-1: Bucles y saltos
L8: Práct 3-2: Cadenas II

P4: Subrutinas

L9: Pract 4-1: Subrut. Nivel-1
L10: Pract 4-2: La pila
L11: Pract 4-3: Recursividad

P5: Memoria Dinámica

L12: Pract 5-1. Heap. Listas

VÍDEO DE DESPEDIDA

SESIONES ADICIONALES

L13: RV32I: Resto de instrucciones
L14: Macros
L15: Entrada/Salida a bajo nivel
L16: Multiplicaciones/divisiones. Unit Tests 🚧
L17: Biblioteca stdio: salida a alto nivel 🚧
Los registros de estado y control (CSR)
Interrupciones y excepciones
Borrador

SOLUCIONES

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

Ejercicios de examen

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
GISAM. Parcial 2. 2025-Nov-19
GISAM. Parcial 3. 2026-Enero-9
GISAM. Parcial 1. 2026-Oct-21
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
TELECO. Parcial 2. 2025-Nov-13
TELECO. Parcial 3. 2026-Ene-21
TELECO. Extra. 2026-Jun-25
TELECO. Parcial 1. 2026-Oct-09
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
Robótica. Parcial 1. 2026-Feb-23
Robótica. Parcial 2. 2026-Abr-13
Robótica. Parcial 3. 2026-May-11
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
Datos. Parcial 2. 2025-Nov-19

Clone this wiki locally