Buenas, me toca hacer una práctica en ensamblador que a primera vista es muy sencilla pero me ha surgido una duda.
La práctica consiste en pasarle un archivo de texto, el programa cifra el texto (sólo cifra las mayúsculas), hasta ahí bien, luego te pide que descifres el texto y compare el original con el descifrado, haciendo que en la consola aparezca un mensaje diciendo si son iguales o no.
Mi duda viene en el segundo paso, en el de descifrar. Nos es facilitada la dirección de memoria de la clave, que es un array/vector/cadena de caracteres. Para cifrarlo leemos un byte del texto original (un caracter) que, si es mayúscula, le restamos 65 (valor de A en la tabla ascii), sumamos el resultado de la resta a la dirección de la clave y el resultado lo guardamos en memoria, en la cadena cifrada.
Para descifrar he implementado este código, pero no sé dónde falla:
texto_descifrado:
la $t0,textocifrado # Guardamos en $t0 la dirección del texto cifrado
la $t1,clave # Guardamos en $t1 la dirección de la clave
la $t2,textodescifrado # Guardamos en $t2 la dirección del texto descifrado
la $t3,clave #t3<- puntero
move $t4,$zero # contador; addu $t4,$zero,$zero
lb $t5,A #t4<- 65
lb $t6,Z #t5<- 90
WHILE_descifrado: lb $t7,0($t0) # cargamos un byte del texto cifrado
beq $t7,$zero,END_WHILE_descifrado # si dicho byte es 0 el texto ha terminado
blt $t7,$t5,END_IF_descifrado # si dicho byte es menor que 65, se guarda en el texto descifrado tal cual
bgt $t7,$t6,END_IF_descifrado # si dicho byte es mayor que 90, se guarda en el texto descifrado tal cual
WHILE_buscador: lb $t8,0($t3) # cargamos el primer byte del vector clave_cifradora
addiu $t3,$t3,1 # avanzamos en dicha cadena
addiu $t4,$t4,1 # contador++
bne $t7,$t8,WHILE_buscador # si t1<>t2 se realiza otra iteración
addiu $t4,$t4,64 # contador=contador+65 para obtener la mayúscula correspondiente
sb $t4,0($t2) # guardamos dicha mayúscula en el texto descifrado
move $t3,$t1 # restauramos el puntero
move $t4,$zero # restauramos el contador
j WHILE_descifrado # nueva iteración
END_IF_descifrado: sb $t7,0($t2) # Guardamos lo que haya en t1 (exclamación, coma, espacio...) en el texto descifrado
addiu $t0,$t0,1 # avanzamos en el texto cifrado
addiu $t2,$t2,1 # avanzamos en el texto descifrado
j WHILE_descifrado # nueva iteración
END_WHILE_descifrado: sb $zero,0($t2) # Guardamos el 0 en el texto descifrado para terminar
jr $ra
Si quito el "j WHILE_descifrado # nueva iteración" que hay encima de "END_IF_descifrado" no me lo descifra pero sí me dice que no son iguales (tercer y último paso) pero si lo dejo, ni descifra ni avanza en el programa, lo he intentado depurar para ver dónde falla pero estoy algo desesperado ya.
Muchas gracias de antemano por la ayuda o a los que lo lean, saludos!
EDITO: ya he terminado la práctica, he tenido que añadir un par de líneas de código encima del J WHILE_descifrado del que hablaba antes para avanzar en las cadenas, ya está todo perfecto así que si queréis cerrar el tema genial. Gracias