Examen: Parcial 2:2024_11_13:Datos - myTeachingURJC/2019-20-LAB-AO GitHub Wiki

Examen Parcial 2: 2024-11-13. Ciencia e Ingeniería de Datos

  • Tiempo: 50 minutos
  • Descripción: Examen Parcial 1. Laboratorio. Grado de Ciencia e Ingeniería de Datos
  • Fecha: 2024/Octubre/9
  • Temario: Sesiones L5, L6, L7 y L8

Contenido

Enunciado

El examen se ha realizado a través de Aula virtual. Tiene dos partes: Test y un programa

Test (5 ptos)

  • Realizado a través de Aula virtual
  • 8 preguntas tipo test
  • Las respuesats incorrectas restan un 33% del valor de la pregunta
  • Solución disponible en Aula virtual

Programa (5 ptos)

Hacer un programa en RARS que convierta una entrada hexadecimal de hasta 32 bits a un decimal sin signo. El programa pedirá el valor en hexadecimal (se supondrá correcto) y mostrará el resultado de convertirlo a decimal, terminando. Si no se da ningún valor (se pulsa directamente intro), terminará sin mostrar nada.

Se muestran a continuación tres ejecuciones de ejemplo (en la última se ha pulsado directamente intro como entrada):

Valor hexadecimal: 12abC

El valor en decimal es 76476

-- program is finished running (0) --


Valor hexadecimal: FFFFffff

El valor en decimal es 4294967295

-- program is finished running (0) --


Valor hexadecimal: 

-- program is finished running (0) --

Notas:

  • La diferencia entre una mayúscula y una minúscula es un bit (ASCII en binario de A=01000001 y de a=01100001). Haciendo un AND u OR adecuado, se puede convertir de una a otra.

  • Si una parte le resulta muy complicada (por ejemplo, que acepte mayúsculas y minúsculas), implemente solo una de ellas y, si le queda tiempo cuando termine el resto, intente completarlo.

  • Si el programa no ensambla, se calificará con un cero. Le recomendamos que vaya guardando versiones que ensamblen según vaya avanzando.

  • Si el fichero donde está su programa referencia a otro fichero, entréguelo también.

Solución al programa

Como siempre ocurre al programar, existen infinitas soluciones. Pero en todas ellas se debe respetar la especificación del enunciado

Este es el contenido del fichero hexaTxt2dec.s:

#  Programa: hexaTxt2dec.s
# Propósito: Convierte cadenas en hexadecimal de hasta 32 bits a decimal sin signo
#     Autor: Javier Macías del Campo
#     Fecha: 09/11/2023
#      Obs.: Se presupone que la cadena introducida es correcta (o vacía, o hexadecimal correcto)

	.include "servicios.asm"
	
	.eqv MAX 10  # Longitud de un hexadecimal de 32 bits más dos (para \n\0)
	.eqv AND_MAY 0xDF  #bin.11011111 para hacer AND para pasar a mayúscula (A 01000001, a 01100001)
	
	.data
bufStr:	.space MAX
txtEnt: .string "Valor hexadecimal: "
txtRes:	.string "El valor en decimal es "
	
	.text
	
	#inicializamos registros para comparaciones, operaciones, etc.
	la s0, bufStr   #s0 => dirección inicio cadena
	li s1, 16       #s1 => multiplicador hexadecimal (16)
	li s2, '\n'     #s2 => fin de línea
        li s3, '9'      #s3 => ascii '9' (para separar '0'-'9' de 'A'-'F')
        li s4, '0'      #s4 => ascii '0' (para restar a '0'-'9' y convertir a decimal)
        li t0, 'A'      #ascii 'A'
        addi s5, t0, -10  #s5 => ascii 'A' - 10 (para restar a 'A'-'F' y convertir a decimal)

        #mostramos mensaje petición valor hexadecimal
        la a0, txtEnt
	li a7, PRINT_STRING
	ecall 
	
	#leemos valor hexadecimal
	mv a0, s0
	li a1, MAX
	li a7, READ_STRING
	ecall
	
	#inicializamos "contadores"
	mv t0, s0       #t0 => puntero a la cadena introducida
	li t1, 0        #t1 => resultado (hasta el momento) en decimal
	
	
	#procesamiento entrada
sigue:  lb t2, 0(t0)    #t2 => carácter a analizar
	
	beq t2, s2, compru  #si es '\n', se ha terminado de analizar
	
ok:	mul t1, t1, s1     #multiplicamos por 16
        bgt t2, s3, digHex #si >'9', es 'A'-'F' o 'a'-'f'  
        
        #es un carácter '0'-'9'
        sub t2, t2, s4   #convertimos a entero
        b suma
        
digHex:	#es un carácter 'A'-'F' o 'a'-'f' 
	andi t2, t2, AND_MAY  #convertimos a mayúscula
	sub t2, t2, s5  #convertimos a entero
	
suma:	add t1, t1, t2  #sumamos al resultado
	addi t0, t0, 1  #incrementamos puntero a la cadena
	b sigue
	
                           
compru:	beq s0, t0, fin  #si estamos al inicio cadena con \n, terminar (cadena vacía)
        
        #escribimos el resultado
        la a0, txtRes
        li a7, PRINT_STRING
        ecall
        
        mv a0, t1
        li a7, PRINT_INT_U
        ecall
        
        li a0, '\n'
        li a7, PRINT_CHAR
        ecall
        
        #terminamos                
fin:	li a7, EXIT
	ecall

Este es el contenido del archivo servicios.asm:

#   Archivo: servicios.asm
# Propósito: Códigos servicios S.O. para incluir en los programas rars
#     Autor: ObiJuan (con adiciones y comentarios de Javier Macías del Campo)
#     Fecha: 09/11/2024

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

Autores

  • Miguel Ángel de Miguel
  • Javier Macías

Licencia

Enlaces