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