Examen: 2021_05_20:Robótica - myTeachingURJC/2019-20-LAB-AO GitHub Wiki

Examen convocatoria ordinaria: 2021-05-20. Ingeniería en Robótica Software

  • Tiempo: 2h
  • Descripción: Examen del Laboratorio del grado de Ingeniería en Robótica Software. Convocatoria extraordinaria
  • Fecha: 2021/Mayo/20

Contenido

Enunciado

Solución comentada

(Por hacer)

Solución

Como siempre ocurre al programar, existen infinitas soluciones. Pero en todas ellas se debe respetar la especificación y no violar el convenio de uso de registros

Estos son los cuatro ficheros de una posible solución:

  • Fichero printhex.s
#-------------------------------------------
# PrintHex(num)
# Entradas:
#   a0: Numero a imprimir en hexadecimal
# Devuelve:
#   nada
#-------------------------------------------

        # -- Servicios del Sistema Operativo
	.eqv PRINT_CHAR   11
	.eqv PRINT_HEX    34

	.globl printhex
	.text

printhex:
	
	# -- Imprimir numero en hexadecimal
	li a7, PRINT_HEX
	ecall
	
	# -- Imprimir Salto de linea
	li a0, '\n'
	li a7, PRINT_CHAR
	ecall
	
	#-- Retornar
	ret
  • Fichero test_printhex.s

	# -- Constantes
	.eqv EXIT         10	
	.eqv PRINT_INT    1
	.eqv PRINT_STRING 4
	
	.data

		
msg:	.string ": "	
	
	.text

	#-- 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, 10
	
	# -- Valor usado para repetir el bucle
	# -- y obtener los numeros del 10 al 15
	li s1, 16

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 hexadecimal
	mv a0, s0
	jal printhex
	
	# -- Incrementar el numero
	addi s0, s0, 1
	
	# -- Mientras s0 sea menor que 16 repetir el bucle
	blt s0, s1, bucle

	#-- Terminar
	li a7, EXIT
	ecall
  • Fichero conversor.s
	# -- Constantes
	.eqv EXIT         10	
	.eqv PRINT_INT    1
	.eqv PRINT_STRING 4
	.eqv READ_INT     5

	.data
msg1:	.string "\nIntroduce numero en decimal: "
msg2:   .string "\nValor en hexadecimal: "
num:    .word 0

	.text
	
bucle:
	# -- 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
	
	# -- Si el numero es 0, terminar
	beq a0, zero, fin

	# -- Guardar resultado en t0
	mv t0, a0

	# -- Imprimir mensaje 2
	la a0, msg2
	li a7, PRINT_STRING
	ecall
	
	#-- Imprimirlo en hexadecimal
	mv a0, t0
	jal printhex
	
	# Repetir el bucle
	b bucle

fin:

	#-- Terminar
	li a7, EXIT
	ecall
  • Fichero test_printhex2.s

	# -- Constantes	
	.eqv PRINT_INT    1
	.eqv PRINT_STRING 4

	.globl test_printhex
			
	.data
		
msg:	.string ": "	
	
	.text

test_printhex:

	# -- 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 registros estaticos
	# -- para no violar el convenio
	sw s0, 0(sp)
	sw s1, 4(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, 10
	
	# -- Valor usado para repetir el bucle
	# -- y obtener los numeros del 10 al 15
	li s1, 16

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 hexadecimal
	mv a0, s0
	jal printhex
	
	# -- Incrementar el numero
	addi s0, s0, 1
	
	# -- Mientras s0 sea menor que 16 repetir el bucle
	blt s0, s1, bucle

	# ------------------  Hasta aqui mismo codigo que problema 2 ------------

	# -- Recuperar el valor de S0 y s1
	lw s0, 0(sp)
	lw s1, 4(sp)

	# -- Recuperar direccion de retorno de la pila
	lw ra, 12(sp)
	
	# -- Recuperar el valor original del sp
	addi sp, sp, 16
	
	#-- Retornar
	ret
  • Fichero main.s
	.eqv EXIT         10

	.text
	
	# -- Llamar a la funcion pedida dos veces
	jal test_printhex
	jal test_printhex
	
	# -- Terminar 
	li a7, EXIT
	ecall
	

Autores

Licencia

Enlaces