Skip to content

Examen: 2020_07_03:GISAM

Juan Gonzalez-Gomez edited this page Jan 13, 2021 · 3 revisions

Examen convocatoria extraordinaria: 2020-07-03. GISAM

  • Tiempo: 1.5h
  • Objetivo:
    • Problema de examen de la convocatoria extraordinadira de GISAM, con fecha 2020/Jul/03

Contenido

Enunciado

Solución comentada

PENDIENTE

Solución

Los cuatro ficheros pedidos son los siguientes:

  • Fichero mult.s
	.text
	
	.globl mult
	
	
# -----------------------------------------------------
# --- Funcion mult(a,b): Calcular a * b
# -- Entradas:
#--  a0: Primero operando  
#--  a1: Segundo operando
#-- Salidas
#--   a0: a*b
#-------------------------------------------------------  	
mult:

	#-- Se trata de una funcion hoja, por lo que no es necesario
	#-- crear la pila para almacenar la direccion de retorno
	
	# -- El resultado de la multiplicacion se calcula
	# -- en el registro temporal t0
	li t0, 0
	
	# -- Se utiliza un bucle para realizar a0 veces la operación
	# -- t0 = t0 + a1
bucle:	
	#--- Si a0 = 0, terminar
	beq a0, zero, fin
	
	# -- Calcular t0 = t0 + a1
	add t0, t0, a1
	
	#-- Decremebtar a0
	addi a0, a0, -1
	
	b bucle
		
fin:	
	#-- Devolver el resultado
	mv a0, t0
	ret
  • Fichero test_mult.s
##---------------------------------------------
#  Programa de prueba de la multiplicacion  
#----------------------------------------------

	# -- Servicio de Exit del S.O
	.eqv EXIT        10 
	.eqv PRINT_STRING 4 
	.eqv PRINT_INT    1
	.eqv READ_INT     5
	.eqv PRINT_CHAR   11

	.data

msg1:   .string "Introduce un numero entero no negativo: "
msg2:   .string " * "
msg3:   .string " = "

	.text
	
	# -- Pedir un numero al usuario
	la a0, msg1
	li a7, PRINT_STRING
	ecall 
	
	li a7, READ_INT
	ecall
	
	#-- Almacenar el numero en s0
	mv s0, a0
	
	#-- Bucle para calcular la tabla de multiplicar
	#-- Se usa el registro s1 como contador (0...10)
	li s1, 0
	
bucle:	
	#--- Imprimir el mensaje del calculo: "Digito" * "numero" = "Resultado"
	#-- Imprimir el numero del usuario
	mv a0, s0
	li a7, PRINT_INT
	ecall
	
	#-- Imprimir la cadeba " * "
	la a0, msg2
	li a7, PRINT_STRING
	ecall
	
	#-- Imprmir el contador
	mv a0, s1
	li a7, PRINT_INT
	ecall
	
	#-- Imprimir el igual
	la a0, msg3
	li a7, PRINT_STRING
	ecall
	
	# -- Realizar la multiplicacion s0 * s1
	mv a0, s0
	mv a1, s1
	jal mult
	
	mv t0, a0
	
	# ------ Imprimir el resultado
	# -- Resultado
	mv a0, t0
	li a7, PRINT_INT
	ecall
	
	# --- Imprimir un salto de linea
	li a0, '\n'
	li a7, PRINT_CHAR
	ecall
	
	#--- Incrementar el contador
	addi s1, s1, 1
	
	# -- Si s1 es menor a 11, repetir 
	li t0, 11
	blt s1, t0, bucle 
	
	# -- La tabla está completa
	
	# -- Terminar
	li a7, EXIT
	ecall
  • Fichero exp.s
	.text 
	
	.globl exp

# ---------------------------------------------
# - Funcion exp(a, n): Calcula a elevado a n 	
# * ENTRADAS
#   a0: base (>=0)
#   a1: Exponente (>0)
# * SALIDAS:
#   a0: Devuelve el resultado (a elevado a n)
#----------------------------------------------
			
exp:

	#-- Se trata de una funcion intermdia, que llama a otra función
	#-- Por tanto debemos crear la pila para guardar la direcion de retorno
	addi sp, sp, -16
	
	#-- Guardar la direccion de retorno
	sw ra, 12(sp)
	
	#-- El registro s0 lo usamos para almacenar la base
	#-- El registro s1 para el exponenete
	#-- Para NO violar el convenio, tenemos que guardarlos en la pila 
	#-- ya que deben tener su valor original al terminar
	sw s0, 8(sp) 
	sw s1, 4(sp)
	
	#-- El calculo intermedio lo guardamos en s2, por lo que
	#-- hay que preservar s2 primero en la pila
	sw s2, 0(sp)
	
	mv s0, a0  #-- Mover la base a s0
	mv s1, a1  #-- Mover el exponente a s1 
	
	
	#-- El resultado de los calculos intermedios lo guardamos
	#-- en s2, Inicialmente s2 = 1
	li s2, 1
	
	#-- Bucle que realiza el cálculo
bucle:	
		
	# -- Calcular base * s2 (Multiplicar la base por el resultado parcial)
	mv a0, s0 #-- Base
	mv a1, s2 #-- Resultado parcial
	jal mult
	
	#-- El resultado lo guardamos en s2
	mv s2, a0 
	
	#-- Decrementar el exponente (que lo usamos de contador)
	addi s1, s1, -1
	
	#-- Cuando sea 0 hemos terminado
	bgt s1, zero, bucle
	
	
	#-- Hemos terminado
	#-- El resultado se devuelve por a0
	mv a0, s2
	
	#-- Recuperar los registros estáticos de la pila 
	lw s0, 8(sp)
	lw s1, 4(sp)
	lw s2, 0(sp)

        #- Recuperar la direccion de retorno
        lw ra, 12(sp)
        
	# -- Recuperar la pila
	addi sp, sp, 16
	ret
  • Fichero: test_exp.s
##---------------------------------------------
#  Programa de prueba de la multiplicacion  
#----------------------------------------------

	# -- Servicio de Exit del S.O
	.eqv EXIT        10 
	.eqv PRINT_STRING 4 
	.eqv PRINT_INT    1
	.eqv READ_INT     5
	.eqv PRINT_CHAR   11

	.data

msg1:   .string "Introduce la base (no negativo): "
msg2:   .string " ^ "
msg3:   .string " = "

	.text
	
	# -- Pedir un numero al usuario
	la a0, msg1
	li a7, PRINT_STRING
	ecall 
	
	li a7, READ_INT
	ecall
	
	#-- Almacenar el numero en s0
	mv s0, a0
	
	#-- Bucle para calcular la tabla de potencias
	#-- Se usa el registro s1 como contador (1...10)
	li s1, 1
	
bucle:	
	#--- Imprimir el mensaje del calculo: "base" ^ "exp" = "Resultado"
	#-- Imprimir la base
	mv a0, s0
	li a7, PRINT_INT
	ecall
	
	#-- Imprimir la cadeba " elevado a "
	la a0, msg2
	li a7, PRINT_STRING
	ecall
	
	#-- Imprmir el contador (exponente)
	mv a0, s1
	li a7, PRINT_INT
	ecall
	
	#-- Imprimir el igual
	la a0, msg3
	li a7, PRINT_STRING
	ecall
	
	# -- Realizar la operacion s0 elevaod a s1
	mv a0, s0
	mv a1, s1
	jal exp
	
	mv t0, a0
	
	# ------ Imprimir el resultado
	# -- Resultado
	mv a0, t0
	li a7, PRINT_INT
	ecall
	
	# --- Imprimiir un salto de linea
	li a0, '\n'
	li a7, PRINT_CHAR
	ecall
	
	#--- Incrementar el contador
	addi s1, s1, 1
	
	# -- Si s1 es menor a 11, repetir 
	li t0, 11
	blt s1, t0, bucle 
	
	# -- La tabla está completa
	
	# -- Terminar
	li a7, EXIT
	ecall

Autores

Licencia

Enlaces

Página principal


Sesiones de Prácticas

P1: Simulador RARs

L1: Práctica 1-1. RARs
L2: Práctica 1-2. Ensamblador
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

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
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
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
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

SOLUCIONES

Práctica 1: Sesiones 1,2 y 3
Práctica 2: Sesiones 4, 5 y 6
Práctica 3: Sesiones 7 y 8
Práctica 4: Sesiones 9, 10 y 11
Práctica 5: Sesión 12

Clone this wiki locally