Skip to content
Snippets Groups Projects
Commit a92facb8 authored by carmuno's avatar carmuno :tennis:
Browse files

Prácticas con Fran (se añade practica final)

parent ff4a6d0e
No related branches found
No related tags found
No related merge requests found
.data
.align 4
.space 2000
cadena_pedida:
.align 4
.space 2000
cadena_almacenar_polinomio:
.align 4
.space 2000
cadena_almacenar_derivada:
.align 2
.space 2000
error_Overflow: .ascii "MAL ENTRADA Error_Overflow" # Cadena para indicar que ha habido overflow en la entrada
.align 2
.space 200
error_HI: .ascii "MAL ENTRADA Error_HI" # Cadena para indicar que ha habido un error en el HI en la entrada
.align 2
.space 200
error_numero: .ascii "MAL ENTRADA Cadena mal especificada" # Cadena para indicar que la cadena ha sido mal especificada por error en el numero
.align 2
.space 200
error_malderivada: .ascii "MAL DERIVADA cadena mal derivada" # Cadena para indicar que ha habido overflow al derivar la entrada
.space 200
.align 2
.space 2000
error_char: .ascii "MAL ENTRADA Cadena mal especificada" # Cadena para indicar que la cadena ha sido mal especificada por un caracter no valido
.align 2
.space 2000
resultado: .ascii
.align 2
.space 200
Cadenas: .asciiz "Introduzca el numero: " # Cadena para solicitar la entrada
.align 2
.space 2000
Cadena_guardar_caracteres_reves: # Cadena donde guardaremos los caracteres al reves
.align 2
.space 2000
CadenaOrdenada: # Cadena donde guardamos los caracteres ordenados
.text
Mi_main:
la $a0, cadena_pedida # Cargamos en $a0 la direccion de la cadena pedida
li $a1, 2000 # Cargamos un 2000 en $a1
li $v0, 8 # Cargamos un 8 en $v0 para leer el string con una llamada al sistema
syscall
jal rellena_vector
bne $v0, 4, NoerrorOverflow
la $a0, error_Overflow
jal imprime_cadena
j fin
NoerrorOverflow:
bne $v0, 3, noerror_HId
la $a0, error_HI
jal imprime_cadena
j fin
noerror_HId:
bne $v0, 2, noerrorchar
la $a0, error_char
jal imprime_cadena
j fin
noerrorchar:
error_tenia_que_ser_numeros:
bne $v0, 5, noerrornumero
la $a0, error_numero
jal imprime_cadena
j fin
noerrornumero:
bne $v0, 6, no_error_elevado
la $a0, error_numero
jal imprime_cadena
j fin
no_error_elevado:
la $a0, cadena_almacenar_polinomio
la $a1, cadena_almacenar_derivada
jal haciendo_derivada
beq $v1,1, mal_derivada
la $a0, cadena_almacenar_derivada
jal hola
move $a0, $v0 # El $vo se genera antes de la funcion 'hola'
move $a2, $v1
jal el_antes_resultado_derivada # En este punto tenemos los registros $s de las funciones anteriores
cnoe:
la $a1 Cadena_guardar_caracteres_reves
jal resultado_derivada
beq $v0, 4 noimprime
la $a0, CadenaOrdenada
jal imprime_cadena
beq $t1, 1, fin
beq $t2, 16, fin
jal remember
noimprime:
addiu $t0, $t0, -4
bne $t8, 46, cnoe # Tras las 15 iteraciones acabare en un 63, porque empezamos con un 48 aprovechando la interacia de cargar como 48 el primero de todos
j fio
mal_derivada:
la $a0, error_malderivada # Cargamos la cadena que imprime el mensaje de error en la derivada
jal imprime_cadena
fio:
fin:
li $v0, 10
syscall
rellena_vector:
addi $sp, $sp, -28
sw $s4, -28($sp)
sw $s1, -24($sp)
sw $s5, -20($sp)
sw $s3, -16($sp)
sw $s2, -12($sp)
sw $s6, -8($sp)
sw $s7, -4($sp)
li $t9, 1
move $t0, $a0
bucle:
addiu $t9, $t9, 1 # Contador
lb $t1, 0($t0) # Cogemos el caracter de la cadena, que sera un '+', un '-', una 'x', una 'X', el numero base o el exponente
beq $t1, 43, final
beq $t1, 32 , final
beq $t1, 10, sal
beq $t1, 0, sal
beq $t3, 1, nunca_mas_elevados
beq $t1, 94, elevado
# Una vez que hemos eliminado todos los caracteres posibles, a esta zona solo acceden los numeros:
# Una vez que hemos combrobado que no es la 'x', la 'X', el '^', el '+' ni el '-', solo puede ser el numero, por lo que ahora determinaremos si es el exponente o la base
nunca_mas_elevados:
bne $t3, 1, numero_normal # Si el anterior digito (en la anterior iteracion) era el '^', entonces $t3 se puso a 1 y aqui dentro restauramos el valor de $t3
# Entendemos que este ya es un numero porque va despues del ^ pero puede no serlo asi que hay que comprobarlo y, en caso de no ser un caracter entre 0-9, lanzar un error
tratamiento: # Restauramos todo #
bne $s3, 1, no_exponenete_1
li $t1, 49
no_exponenete_1:
bne $s3, 2, no_exponente_0
li $t1, 48
no_exponente_0:
bgt $t1, '9', error_tenia_que_ser_numero
blt $t1, '0', error_tenia_que_ser_numero
# Si no es un numero entre 0 y 9 y es otra 'x' u otro simbolo, lo manda fuera y captura el error
# Como es un numero, entonces hacemos el tratamiento porque se trata del numero para el exponente
# Numero exponente #
li $t3, 0 # Restauramos el valor de $t3 para indicar que ya estamos tratando el exponente
# Entonces tenemos en $t1 el exponente, que es la posicion del vector donde poner la base y en $t2 el numero asociado a dicho exponente
la $t4, cadena_almacenar_polinomio
addiu $t5, $t1, -48 # Tenemos el numero para almacenar la posicion en el vector
move $s6, $t5
beq $s3, 1, no_mas
beq $s3, 2, no_mas
lb $t1, 1($t0) # Traemos el siguiente valor del exponente y si vemos que tambien es un numero lo tratamos
bgt $t1, '9', no_mas_cifras
blt $t1, '0', no_mas_cifras
addiu $t5, $t5, 9 # Sumamos 9 al numero para formar la base
addiu $s7, $t1, -48
addu $t5, $s7, $t5
addiu $t0, $t0, 1 # Aumentamos el puntero una vez para saber que ya estamso tratando la siguiente iteracion
beq $s6, 1, no_overflow
li $v0, 4 # No afectaria al codigo de negativo ya que este se coloca antes y se trata en el numero (antes de que entre en el exponente)
j sal
no_overflow:
no_mas:
li $s3,0 # Restauracion del valor de $s3
no_mas_cifras:
blt $t5, 16, NO_Overflow_exponente
overrr:
li $v0, 4 # No afectaria al codigo de negativo ya que este se coloca antes y se trata en el numero (antes de que entre en el exponente)
j sal
NO_Overflow_exponente:
mulu $t5, $t5, 4
addu $t4, $t5, $t4 # Apuntamos a la direccion de memoria correcta
lw $t6, 0($t4) # Primero traemos el valor anterior almacenado en el vector, y si nunca se ha accedido a la posicion sera un 0
addu $s1, $t6, $t2 # Cuando existan distintas bases con el mismo exponente se suman y si no tuviera varios se sumaria el numero con 0
bgt $t6, 0, siguinetee
# Aqui es menor que 0:
blt $t2, 0, menores
j alfinal
menores:
bgt $s1, 0, overrr
j alfinal
# Aqui no pasaria
siguinetee:
bgt $t2, 0, mayor_00
j alfinal
mayor_00:
blt $s1, 0, overrr
alfinal:
sw $s1, 0($t4) # Metemos en la posicion $t1 + $t4 del vector el valor de $s1.
# $t4 es la posicion inicial del vector y le sumamos el exponente que es $t1 para acceder a la posicion correcta
li $t2, 0 # Volvemos a actualizar el valor de $t2
# Cuando se vuelve a pasar se pisa el valor de $t6
j final
numero_normal: # Nos referimos a la base, no al exponente
# Tiene que ir iterando aqui dentro hasta que encuentre una 'x' #
li $s2, 0 # Contador
Buclesss: # Segundo bucle de pasada #
lb $t1, 0($t0)
# Si es la primera vez que pasa por este bucle pequenio y lo primero que encuentra es una x, entonces el valor que le das a la base es un 1
bne $t1, 45, sno # Comprobamos si $t1 es igual a 45 (el guion en ASCII) para ver si el numero es negativo
li $t9, 1 # Si el numero ha sido negativo (el primer caracter es un guion) cargamos un 1 en $t9 como flag de estado
sno:
bne $s2, 0, noesprimeravez
bne $t9, 1, si_no_neg
lb $t3, 1($t0)
bne $t3, 120, es_la_otra_X_pregunto # Si tampoco es la 'x' vemos si es la 'X'
j awi
es_la_otra_X_pregunto:
bne $t3, 88, es_menor_normal # Si tampoco es la 'X' saltamos
awi:
# Si es negativo:
li $t2, 1
li $t3, 1
add $t0, $t0, 1 # Aumentamos en uno el puntero para tratar la 'x'
j fines
si_no_neg:
bne $t1, 120, es_X_pregunto # Si tampoco es la 'x' vemos si es la 'X'
j er
es_X_pregunto:
bne $t1, 88, noesx # Si tampoco es la 'X' me piro
er:
li $t2, 1
li $t3, 1
j fines
noesx:
es_menor_normal:
noesprimeravez:
beq $t1, 32 , continua # Adicion #
add $s2, $s2, 1
bne $s2, 1, pasamos_primera
bne $t1, 45, sigue # Comprobamos si $t1 es igual a 45 (el guion en ASCII) para ver si el numero es negativo
li $t9, 1 # Si el numero ha sido negativo (el primer caracter es un guion) cargamos un 1 en $t9 como flag de estado
j esNegativo # Y saltamos a la etiqueta esNegativo
pasamos_primera:
bne $t1, 10 , siguesviendo # Si el siguiente caracter es una 'x', dejamos de iterar
li $s3, 2 # Significa que esta elevado a 0
j tratamiento
siguesviendo:
bne $t1, 43, siguesviendo2
li $s3, 2 # Significa que esta elevado a 0
j tratamiento
siguesviendo2:
bne $t1, 45, siguesviendo3
li $s3, 2 # Significa que esta elevado a 0
j tratamiento
siguesviendo3:
bne $t1, 0, siguesviendo4
li $s3, 2 # Significa que esta elevado a 0
j tratamiento
siguesviendo4:
beq $t1, 120 , fines
beq $t1, 88 , fines
sigue:
lb $t3, 1($t0)
beq $t3, 43, errorChar # Si encuentra dos '+' seguidos tiene que dar un error
beq $t1, 43, continua # No imprime el primer '+'
blt $t1, 48, errorChar
bgt $t1, 57, errorChar
subi $t7, $t1, 48 # Resta al valor de $t1 48 para pasar el caracter a entero
mul $t2, $t2, 10
mfhi $t4 # Cargamos en $t4 el valor del registro HI para comprobar el desbordamiento
bne $t4, $zero, errorHI # Si el valor traido de HI es distino de cero saltamos a la etiqueta error porque ha habido desbordamiento
mflo $t5 # Cargamos en $t5 el valor del registro LO para comprobar el desbordamiento
bltz $t5, errorHI # Si el valor traido de LO es menor que cero saltamos a la etiqueta error porque ha habido desbordamiento
addu $s4, $t7, $t2
# Hacemos la comprobacion de la suma #
bgt $t7, 0, siguinetee3
# Aqui es menor que 0:
blt $t2, 0, menores3
j alfinal44
menores3:
bgt $s4, 0, overrr
j alfinal44
# Aqui no pasaria
siguinetee3:
bgt $t2, 0, mayor_003
j alfinal44
mayor_003:
blt $s4, 0, overrr
alfinal44:
move $t2, $s4
continua:
esNegativo:
lb $t3, 1($t0)
beq $t3, 45, errorChar # Si encuentra dos '-' seguidos tiene que dar un error
# Solo se ejecuta si el numero es negativo #
addiu $t0, $t0, 1 # Aumentamos en uno al apuntador para "olvidar" el signo menos y convertir el string a entero como si fuese positivo
j Buclesss
fines:
lb $t3, 1($t0)
beq $t9, 1 , menor # Comprueba el flag de estado de $t9:
# Si $t9 vale 1 es que el numero es negativo, por lo que salta a la etiqueta menor
j otro # Salto incondicional a la etiqueta otro si el numero es positivo
menor: # Se ejecuta si el flag de estado indica que el numero es negativo
mul $t2, $t2, -1 # Multiplica por -1 el valor de $t2 para obtener definitivamente el numero introducido en String
otro:
beq $t3, 32, final
bne $t3, 43, no_es_mas_el_siguiente
li $s3, 1
j tratamiento
no_es_mas_el_siguiente:
bne $t3, 45, no_es_menos_el_siguiente
li $s3, 1
j tratamiento
no_es_menos_el_siguiente:
bne $t3, 10, no_es_salto_el_siguiente
li $s3, 1
j tratamiento
no_es_salto_el_siguiente:
bne $t3, 94, error_tenia_elevado
lb $t3, 2($t0)
beq $t3, 10, error_tenia_elevado
j termino
errorHI: # Se ejecuta cuando encuentra un error que puede ser debido a varias causas
li $v0, 3 # Indica error del HI o del LO
j sal
errorChar:
li $v0, 2
j sal
error_tenia_que_ser_numero:
li $v0, 5
j sal
error_tenia_elevado:
li $v0, 6
j sal
no_mas_cifras2:
j final
elevado:
li $t3, 1 # Cuando tenemos el '^' esperamos que la siguiente cifra sea el exponente, asi que dejamos esto a 1 para reconocer que la siguinete cifra es el exponente
# Cuando tratemos el exponente ponemos $t3 a 0 de nuevo
noespacio:
saltox:
positivo:
final:
termino:
lb $t1, 0($t0) # Cogemos el caracter de la cadena, que sera un '+', un '-', una 'x', una 'X', el numero base o el exponente
bne $t1, 43, no_mirar
lb $t1, 1($t0) # Cogemos el caracter de la cadena, que sera un '+', un '-', una 'x', una 'X', el numero base o el exponente
beq $t1, 43, errorChar
no_mirar:
addiu $t0, $t0, 1
j bucle # Saltamos a bucle
sal:
lw $s4, -28($sp)
lw $s1, -24($sp)
lw $s5, -20($sp)
lw $s3, -16($sp)
lw $s2, -12($sp)
lw $s6, -8($sp)
lw $s7, -4($sp)
addi $sp, $sp, 28
jr $ra
haciendo_derivada:
# Tenemos el vector con los numeros colocados en sus posiciones correspondientes
addi $sp, $sp, -8
sw $s7, -4($sp)
sw $s1, -8($sp)
move $t0, $a0 # Pisamos el registro, por lo que en $t0 esta la cadena donde esta el polinomio bien colocado
move $t2, $a1 # En $t2 esta la cadena donde vamos a poner los resultados de las derivadas
li $t9, 0
li $s7, 1
bucle_derivada:
lw $t1, 0($t0) # Traemos la primera posicion correspondiente al el exponente 0
bne $t9, 0, mayor_1 # Las dos primeras iteraciones las metemos en la primera posicion
# Mientras sea 2 o menos:
# $t9 empieza en 0 y hace hasta iteracion 1, despues va a mayor que 2 y en este bucle almacenamos en la primera posicion del vector
# Si es 0, no hacemos nada
sw $zero ,0($t2)
aqui:
j vamonos
mayor_1:
mult $t9, $t1 # Multiplicamos el elemento que sale del vector por la posicion que ocupa dentro del mismo que es su exponente
bge $t1, $zero, mayor_0 # Vemos si es negativo o positivo
mfhi $s1 # Cargamos en $s1 el valor del registro HI para comprobar el desbordamiento
bne $s1, -1, errorHI4 # Si el valor traido de HI es distino de cero saltamos a la etiqueta error porque ha habido desbordamiento
mflo $t1 # Cargamos en $t1 el valor del registro LO para comprobar el desbordamiento
bgt $t1, $zero, errorHI4 # Si el valor traido de LO es menor que cero saltamos a la etiqueta error porque ha habido desbordamiento
j go
mayor_0 :
mfhi $s1 # Cargamos en $s1 el valor del registro HI para comprobar el desbordamiento
bne $s1, $zero, errorHI4 # Si el valor traido de HI es distino de cero saltamos a la etiqueta error porque ha habido desbordamiento
mflo $t1 # Cargamos en $t1 el valor del registro LO para comprobar el desbordamiento
blt $t1, $zero ,errorHI4 # Si el valor traido de LO es menor que cero saltamos a la etiqueta error porque ha habido desbordamiento
go:
addiu $t2, $t2, 4
sw $t1, 0($t2) # Lo almacenamos en la poscion 0 y luego en la primera iteracion (mas abajo) lo volvemos a colocar en la posicion 0
# Es decir, lo almacenamos en la primera posicion del vector (pos 1) y no en las posiciones 0 que eran las anteriores
bne $t1, 0, dist
# Si a partir del primero, al hacer todos la derivada son todos 0, se activa la bandera de poner a todo un 0
addi $s7, $s7, 1 # Si es 0, aumentamos el contador y luego comprobamos si en todas las posiciones se ha cargado un 0
# Si en las 16 posiciones se ha cargado un 0 imprimimos un 0
dist:
vamonos:
addu $t0, $t0, 4
addu $t9, $t9, 1
# No aumentamos el iterador
bne $t9, 16, bucle_derivada
move $v0, $s7 # Retornamos el valor de $s7 para la siguiente funcion (para saber si ha sido todo ceros)
lw $s7, -4($sp)
lw $s1, -8($sp)
addi $sp, $sp, 8 # Restauracion del valor $s7
j finalll
errorHI4:
li $v1,1
finalll:
jr $ra
hola:
addi $sp, $sp -4
sw $s0, -4($sp)
move $t0, $a0 # En $t0 esta la cadena donde tenemos el resultado de la derivada
addu $t0, $t0, 64
li $s0, 63 # Utilizamos un $s, por lo que tras las 15 iteraciones acabare en un 63
move $v1, $s0 # Para retornar el valor de $s0, y que lo reciba la funcion siguiente como $a2
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
el_antes_resultado_derivada:
move $t8, $a2 # El exponenete
move $t2 ,$a0 #Todo ceros
jr $ra
resultado_derivada: # Aqui vamos a usar el vector donde tenemos la derivada almacenada en el vector
addi $sp, $sp, -8
sw $s0, -4($sp)
sw $s4, -8($sp)
siguiente_posicion:
lw $t1, 0($t0) # En $t0 tenemos el resultado de la derivada y lo tendremos que pasar a cadena mas tarde (nos traemos un numero y lo trataremos para sacarlo como ASCII)
li $v0, 0
bne $t2, 16, no_0
la $t4, CadenaOrdenada
li $t3, '0'
sb $t3, 0($t4) # Aniadimos un caracter 0
j finnnal
no_band:
no_0:
no_es_ultima_iteracion:
beq $t1, $zero, mepiro
# En $t1 movemos el numero para convertirlo a cadena
li $t2, 0
li $v1, 0
bgt $t1, $zero, esmayorque0 # Si es mayor bifurca porque no hay ningun tratamiento pero si es menor lo tratamos
li $v1, 10
mulu $t1, $t1, -1 # Lo hacemos positivo
esmayorque0:
move $t9, $a1 # En $t9 tenemos la cadena resultado que sera la que mostremos por pantalla
li $t7, 0
addiu $t3, $t8, -48 # $t3 no se utilizaa en esta iteracion hasta llegar a a continuacion que se resetea a 0
li $s4, 4
j bucle2 # Pasamos a bucle2 el contenido del numero del 10-15 segun corresponda bien puesto
contunuacion:
# En $a1 tenemos la cadena
li $t3, '^'
li $t4, 'x'
li $t5, '-'
li $s0, '+'
li $s4, 0
beq $t8, 49, no_ponemos_elevado
beq $t8, 48, no_ponemos_elevado # Para referirnos al cero
sb $t3, 0($t9) # Aniadimos el '^'
addiu $t9,$t9, 1
addiu $t7,$t7,1 # Contador
no_ponemos_elevado:
beq $t8, 48, no_ponemos_x # Para referirnos al cero
sb $t4, 0($t9) # Aniadimos la 'x'
addiu $t9,$t9, 1
addiu $t7,$t7,1 # Contador
no_ponemos_x:
bucle2:
bne $s4, 4, normal # Estamos en el tratamiento del exponente ($s4 a 4)
move $t4, $t3
beq $t8, 48, no_ponemos_exponente # Para referirnos al cero
beq $t8, 49, no_ponemos_exponente # Para referirnos al uno
j puesalfinalexponente
normal:
move $t4, $t1
puesalfinalexponente:
li $t5, 10 # Cargamos un 10 en $t5 para poder divuidir entre 10
ruleta: # Bucle donde obtenemos los caracteres del numero introducido por teclado
divu $t4, $t5 # Dividimos entre 10
mfhi $t2 # Traemos a $t2 el resto desde el registro hi
addiu $t2, $t2, 48 # Sumamos 48 al valor para obtener el caracter en ASCII
addiu $t7,$t7,1 #contador
sb $t2 0($t9) # Guardamos el caracter en la cadena como guardamos en cadena en formato ascii ponemos sb en vez de sw, y aumentamos en 1 el puntero en vez de aumetarlo en 4
addiu $t9,$t9, 1 # Incrementamos la posicion de la cadena
mflo $t4 # Traemos a $t1 el cociente desde el registro lo
bne $t4, $0, ruleta
no_ponemos_exponente:
bne $s4, 4, nadadenada # Bandera
j contunuacion
nadadenada:
# En la primera iteracion ignora lo siguiente y en la siguiente ya no
addiu $t6, $t6, 1
bne $v1, 10, es_mas
li $s5, '-'
sb $s5, 0($t9) # Aniadimos el '-'
addiu $t7,$t7,1 # Contador
j electrohousecnoe
es_mas:
beq $t6, 1, imprime_bien
li $s0, '+'
sb $s0, 0($t9) # Aniadimos el '+'
addiu $t7,$t7,1 # Contador
electrohousecnoe:
imprime_bien:
la $a0, CadenaOrdenada
la $a1, Cadena_guardar_caracteres_reves
move $t1 ,$a0
move $t2, $a1
addi $t7, $t7, -1
addu $t3, $t2, $t7
bucle23:
addiu $t7, $t7, -1
lb $t4, 0($t3)
sb $zero ,0($t3)
addiu $t3, $t3, -1
sb $t4, 0($t1)
addiu $t1, $t1, 1
bgez $t7, bucle23
j finnnal
mepiro:
li $v0, 4
finnnal:
addiu $t8, $t8, -1 # Disminuimos el exponente
# Pila: restauracion de valores #
lw $s0, -4($sp)
lw $s4, -4($sp)
addi $sp, $sp, 8
jr $ra
imprime_cadena :
li $v0, 4
syscall
jr $ra
remember:
la $a1, CadenaOrdenada
li $t1, 0
remembermyname:
sb $zero, 0($a1)
addiu $a1, $a1, 1
addiu $t1, $t1, 1
bne $t1, 15 ,remembermyname
jr $ra
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment