|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - manurodri189
26
« en: Viernes 12 de Junio de 2009, 09:28 »
Despues de unos dias ocupado con otras cosas, he vuelto a la carga con esto, a ver si ya lo acabo que creo que queda poquito. Al final me decidí por la perdida de rango, entoces solamente tendria que hacer la siguiente modificacion: almacenar: sb $a0,0($a3) #meto el caracter en la primera direccion de a3 sb $a1,0($a2) #meto el contador en la primera direccion de a4 #avanzo el puntero addiu $a3,$a3,1 addiu $a2,$a2,1
Osea almacenar un byte en vez de una palabra, y el desplazamiento 1 en vez de 4, cierto? Otra cosa, me dices que para eliminar el caracter "enter" seria una vez lo tengo en el buffer quitarlo, y que es relativamente facil, mira tengo esto: #Almacenar el String en la matriz # Número de syscall ori $v0,$zero,8 # $a0 = buffer para guardar la cadena la $a0,Entrance # $a1 = tamaño a leer ori $a1,$zero,80 syscall
Ahora mismo tengo la cadena en Entrance, incluyendo el caracter "enter", no se me ocurre como, o almenos una manera sencilla, se me ocurre, que una vez tenga la cadena medita en Entrance, calcular el tamaño de entrance, y volver a leer pero ahora desde Entrance, a una nueva matriz, donde el tamaño sea el tamaño de Entrance-1, pero esto no se me ocurre como hacerlo y menos de manera sencilla, alguna solución mas factible? Salu2 PD: Muchas gracias de nuevo.
27
« en: Sábado 6 de Junio de 2009, 13:16 »
¿Qué diferencia hay entre un número de un byte y uno de una palabra?. Pues no lo se tío, el tamaño seguro, porque una palabra son 4 bytes, pero no se la diferencia a la hora de operar. Salu2
28
« en: Sábado 6 de Junio de 2009, 12:43 »
Sí, pero tu problema ahora va a ser el alineamiento. Es decir, si guardas un byte y una palabra, la palabra no va a estar alineada en una dirección múltiplo de 4 bytes y te va a dar error de alineamiento. Esto lo puedes solucionar de 2 formas: o bien convirtiendo los bytes en palabras (con el consiguiente gasto de memoria) o bien conviertes los números en bytes (con la consiguiente pérdida de rango). Que quieres decir con perdida de rango? si lo pmeto como byte, no podre operar con el como numero? porque lo necesitaria para decodificarlo, no? y si lo meto como palabra, a la hora de imprimirlo chungo, no? que me recomiendas? Mejor elimínalo al principio, justo tras guardar la cadena en Encode. Ya que es el penúltimo carácter, debería ser algo sencillo. Osea antes de meterlo a encode, directamente no lo meto y listo, no? esa es la idea verdad? Y para la decodificacion posterior algo parecido, no? Salu2
29
« en: Viernes 5 de Junio de 2009, 14:46 »
Pues el 2 lo he acabado usando porque con el 4 no me dejaba.
Pues lo que esta hecho funciona, al menos con los caracteres, ya que estos si me los imprime correctamete.
Lo de la impresion de los numeros de momento, como era de prueba no lo voy a hacer. Asi que supongo que en encode1, tengo los caracteres, y en encode2, las veces que se repite.
Ahora he creado un nuevo "vector" encode, tendria que almacenar un numero, una letra, y asi, hasta que no sea final de caracter, no es asi? algo como el siguiente caracter, no?
Por cierto recuerdo que el enter me lo contaba, como lo puedo eliminar de encode 1 y de encode2?
Salu2
30
« en: Viernes 5 de Junio de 2009, 14:01 »
Cierto, tengo que coger soltura con esto, vamos a ver: Lo de avanzar el puntero, error tonto, #avanzo el puntero addiu $t3,$t3,1 addiu $t4,$t4,1
Y lo del syscall error tonto tambien, solamente tengo que cambiar el 4 por un 1. Y ahora creo que lo otro te he entendido, pongo lo que he modificado: start: la $s0, Entrance la $s3, encode1 #almaceno la direccion de encode1 en s3, s3 es el puntero la $s4, encode2 #almaceno la direccion de encode2 en s4, s4 es el puntero or $a3,$zero,s3 or $a4,$zero,s4
Como aqui solo entra una vez, pues preparo los registros, no es asi? almacenar: sb $a0,0($a3) #meto el caracter en la primera direccion de s3 sw $a1,0($a4) #meto el contador en la primera direccion de s4 #avanzo el puntero addiu $a3,$a3,1 addiu $a4,$a4,1 # Volvemos de la función jr $ra nop
Lo unico que me da errores en los or, no se hacia asi? independientemente de los errores en los or, la idea es esa, verdad? Salu2
31
« en: Viernes 5 de Junio de 2009, 13:11 »
Ahora me pasa una cosa rarisima. Dejo la funcion así: almacenar: la $t3, encode1 #almaceno la direccion de encode1 en s3, s3 es el puntero la $t4, encode2 #almaceno la direccion de encode2 en s4, s4 es el puntero sb $a0,0($t3) #meto el caracter en la primera direccion de s3 sw $a1,0($t4) #meto el contador en la primera direccion de s4 #avanzo el puntero addiu $t3,$zero,1 addiu $t4,$zero,1 # Volvemos de la función jr $ra nop
y para finalizar el programa e imprimir asi: fin: ori $v0,$zero,4 la $a0,encode1 syscall ori $v0,$zero,4 la $a0,encode2 syscall ori $v0,$zero,10 # Terminamos con exit syscall
Pues bien cuando lo ejecuto todo de golpe, no hace nada, se queda seco. Y cuando lo ejecuto paso por paso, cuando acaba empieza a dar excepciones del tipo: Se supone que lo tengo guardado en encode1 y encode2, no? Salu2
32
« en: Viernes 5 de Junio de 2009, 13:05 »
vaya paciencia la tuya Salu2
33
« en: Viernes 5 de Junio de 2009, 12:45 »
Lo de s3 es que se me ha pasado, en el segundo queria poner s4.
Vale lo de a0 lo entiendo, es ciero que se pasaban por esos registros, aunque el caracter este también en s1.
Pero lo de a1, no, en a1 esta el siguiente caracter y no el contador, que, no? osea si es asi, entonces en no_iguales tendria que guardar el $t1 en un registro aX como puede ser el a4, no?
Salu2
34
« en: Viernes 5 de Junio de 2009, 12:06 »
Bien, creo que lo he entendido, ahora no me da fallo al ejecutarlo, pongo el método: almacenar: la $s3, encode1 #almaceno la direccion de encode1 en s3, s3 es el puntero la $s4, encode2 #almaceno la direccion de encode2 en s4, s4 es el puntero #sb para caracter #sw para los numeros sb $t1,0($s3) #meto el caracter en la primera direccion de s3 sw $s1,0($s3) #meto el contador en la primera direccion de s4 #avanzo el puntero addiu $s3,$zero,1 addiu $s3,$zero,1 # Volvemos de la función jr $ra nop
Bien, no te entendi bien esto: Además, acuérdate de que las funciones no deberían modificar el valor de los registros sX, o si lo hacen deben restaurar el valor que tenían previamente. Osea en los Sx, debo almacenar algo, y dejarlo perenne? entonces seria mejor que usara los registros tX en la funcion almacenar en vez de los sX, no? Ahora intento imprimirlo para ver si lo he hecho bien: fin: ori $v0,$zero,4 la $a0,encode1 syscall ori $v0,$zero,4 la $a0,encode2 syscall ori $v0,$zero,10 # Terminamos con exit syscall
Pero el programa no imprime nada, osea que algo en almacenar no tira, porque creo que lo de imprimir si lo cogí. Salu2
35
« en: Viernes 5 de Junio de 2009, 11:37 »
Me parece que ese código no te va a funcionar porque es erróneo, y mucho. Pruébalo y verás lo que te dice el simulador. Te falta por aprender ensamblador MIPS básico... y te aconsejo que te pongas las pilas, porque no siempre vas a tener el foro delante, no sé si me explico Creo que estoy pillando cosillas, pero la verdad es que estoy verde verde, y como tu bien dices, no voy a tenerte aqui siempre, eso es cierto. Puedes hacerlo como te dé la gana, siempre que funcione, aunque al final voy a terminar haciéndolo todo yo Yo lo que digo es hacer otra función que se llame tras procesar(), por ejemplo llamada almacenar()
Sólo quedaría por hacer la función almacenar(), claro. Pero si quieres meterlo todo en la misma función, tú mismo. A mí simplemente me parecen dos funciones diferentes, y así incluso podrías usar procesar() o almacenar() para otro ejercicio u proyecto. Vale vale, ya lo pillo, pense que te referias a otra cosa. Bueno, ya me dices, un saludo y mírate las instrucciones de MIPS bien El documento que uso para mirar el repertorio de instrucciones es este: http://rapidshare.com/files/235243032/R ... S.pdf.htmlCreo que esta bien explicado, pero hay cosas que no me quedan claras, y por eso dudo, por ejemplo, ya me he dado cuenta que para cargar la direccion hay que usar la, pero para cargar el dato directamente en una direccion de memoria no se exactamente la funcion que tengo que usar, si sw, sb u otra, pongo esto: almacenar: la $s3, encode1 #almaceno la direccion de encode1 en s3, s3 es el puntero la $s4, encode2 #almaceno la direccion de encode2 en s4, s4 es el puntero sw $t1,$s3 #meto el caracter en la primera direccion de s3 sw $s1,$s3 #meto el contador en la primera direccion de s4 #avanzo el puntero addiu $s3,$zero,1 addiu $s3,$zero,1
o esto: almacenar: la $s3, encode1 #almaceno la direccion de encode1 en s3, s3 es el puntero la $s4, encode2 #almaceno la direccion de encode2 en s4, s4 es el puntero sb $t1,$s3 #meto el caracter en la primera direccion de s3 sb $s1,$s3 #meto el contador en la primera direccion de s4 #avanzo el puntero addiu $s3,$zero,1 addiu $s3,$zero,1
Y me casca, en el sb o sw, pero es que no encuentro otra instruccion de store que me pueda hacer eso. Salu2
36
« en: Viernes 5 de Junio de 2009, 10:25 »
Dios!!! era eso!!!. Si te escucho tio pero eso se me pasó. Ahora a ver si lo he entendido, tengo que hacer una funcion nueva para que me almacene el contador en encode2 y el caracter en encode1, me dices que la llamarias detras de procesar, pero no se si te refieres a llamarla inmediatamente detrás de procesar o de todo el proceso, osea procesar_noiguales, yo es que solo concibo llamarla despues de procesar_noiguales. Entiendo que el contador esta almacenado en el registro t1, osea el contenido de t1 es el numero de repeticiones de un caracter. Y el caracter esta referido desde el puntero, osea que supongo que accediendo a 0($a0) tengo el caracter no es asi? Ahora bien, seria tan facil como hacer: add $t3,$zero,encode1 #almaceno el puntero encode1 en t3 add $t4,$zero,encode2 #almaceno el puntero encode2 en t4 add $t4(0),$zero,$t1 #en la primera direccion almacendo el contador. add $t3(0),$zero,0($a0) #en la primera direccion almacendo el caracter. #Avanzo los punteros a la siguiente posicion addiu $t3,$zero,1 addiu $t4,$zero,1
Que te parece? Salu2
37
« en: Jueves 4 de Junio de 2009, 19:32 »
Debe de ser problema mio, pero no entiendo porque, yo solamente copio el texto a un block de notas y le cambio la extensin de txt a asm. Si lo ejecuto en PCSPIM, me da esa exception y me imprime infinitos "1" y tengo que cerrar el programa, y si lo ejecuto en MARS, me da esto: Assemble: assembling C:Documents and SettingsRaistlinEscritorioencode.asm
Assemble: operation completed successfully.
Go: running encode.asm
Error in encode.asm line 76: Runtime exception at 0x00400078: address out of range 0x00000050
Go: execution terminated with errors. He probado con 2 ordenadores diferentes, no puedo imaginar cual es el problema. Salu2 PD: es profesor.
38
« en: Jueves 4 de Junio de 2009, 18:43 »
En el PCSPIM, me da el mismo error. Me he bajado el MARS y la verdad es que tiene mejor pinta, pero en la salida me pone esto: Assemble: assembling C:Documents and SettingsAdministradorEscritorioencode2.asm
Assemble: operation completed successfully.
Go: running encode2.asm
Error in encode2.asm line 70: Runtime exception at 0x0040006c: address out of range 0x00000050
Go: execution terminated with errors. Creo que seguiré usando el PCSPIM, más que nada, porque el que me lo mandó usa PCSPIM, y lo va a probar en ese. Salu2
39
« en: Jueves 4 de Junio de 2009, 18:26 »
Ehhhh, estoy aprendiendo verdad? xDDDDD Lo acabo de ejecutar paso a paso, y me salta justo aqui: Salu2
40
« en: Jueves 4 de Junio de 2009, 18:02 »
Me da este error: Supongo que habrá que usar or en vez de ori, no? ya que ori es para un valor inmediato y estamos usando registros, no es asi? Y si lo cambio, al ejecutar sale esto: Salu2
41
« en: Jueves 4 de Junio de 2009, 13:00 »
Perdona? no hombre, te estoy muy agradecido, no me pidas perdón encima coño Ahora me tengo que ir luego le hecho un ojo y me pongo con la función esa a ver que sale. Salu2
42
« en: Jueves 4 de Junio de 2009, 12:38 »
Ok, he cambiado esto: procesar: addiu $v0, $zero, $zero # Inicializamos valores de retorno addiu $v1, $zero, $a1 addiu $t1, $zero, $zero # Contador de caracteres iguales consecutivos
por esto: procesar: add $v0, $zero, $zero # Inicializamos valores de retorno add $v1, $zero, $a1 add $t1, $zero, $zero # Contador de caracteres iguales consecutivos
Ya que en los 3 me daba el mismo error. Ahora ejecuto el programa con la cadena "aabb" y se vuelve loco. Salu2
43
« en: Jueves 4 de Junio de 2009, 10:44 »
JR sólo copia el registro indicado al registro PC. En este caso $ra. Cuando haces jal, la dirección de ejecución + 8 se guarda en el registro $ra, que sería la dirección de retorno. Es donde volvemos al hacer jr $ra. Ok, entendido. Yo no lo haría así. Haría otra función y la llamaría tras procesar(). Ya tienes el número de caracteres y el carácter, sólo habría que almacenar en la dirección de memoria correcta Ok vere a ver si soy capaz de hacer eso. El PcSpim no es un programa ejemplar que digamos Quítale los espacios tras las comas. Me he asegurado de quitar todos los espacios tras las comas, y nada, sigue dando exactamente el mismo error. Pero habia mucho mas espacios, porque el error justamente ahi? Salu2
44
« en: Jueves 4 de Junio de 2009, 10:07 »
Bueno me he dispuesto a probarlo, y me salta el siguiente error al cargar el archivo: Esto que significa? Salu2
45
« en: Jueves 4 de Junio de 2009, 09:57 »
Creo que lo he entendido todo excepto esto: Esto se supone que devuelve el flujo de control a la funcion que lo llamo anteriormente, no? osea a sig_caract, no? Y otra cosa a la hora de almacenar las salidas lo deberia hacer en procesar_noiguales, no? Por cierto no te preocupes por los nombres, luego tengo que traducirlo todo al ingles xDDD. Muchas gracias de nuevo tio. Salu2 PD: no serás de las pedroñeras, no?
46
« en: Martes 2 de Junio de 2009, 19:45 »
La comparacion no seria con entrance seria con $s0, ya que es el puntero al siguiente caracter, cierto? osea esta linea: Salu2
47
« en: Martes 2 de Junio de 2009, 18:58 »
Antes de nada una pregunta, en $a0 tengo el primer caracter, para compararlo con el siguiente solamente tendría que compararlo con Entrance, que se supone que ya esta apuntando ahi, cierto? Esto ya lo he entendido: al entrar en la función procesar, ¿qué estás haciendo? La llamada al sistema 4 imprime un cadena de caracteres, cuyo puntero es $a0. Pero en $a0... ¡¡tenemos un carácter (el código ASCII del carácter)!!. Y claro, en esa dirección de memoria no hay nada, por tanto no imprime nada Y luego imprimes msg2 que es un espacio. Es como la etiqueta msg1, ya que msg1 es lo que almacenamos en $a0, y lo me me imprime es el mensaje, ya que msg1 apunta al mensaje, facil. Pero lo de imprimir un solo caracter no sabria hacerlo, aunque en realidad no me vale para este ejercicio era solo para toquetear. He continuado con el ejercicio a ver que tal: procesar: beq $a0,Entrance, counter #si es igual incremento el contador $a1 y vamos a sig_caract nop #meter el caracter en encode1 $si es diferente #meter el contador en encode2 jal sig_caract # Volvemos de la función jr $ra nop counter: addi $a1,$a1,1 jal sig_caract
Que tal pinta tiene esto? aunque no se meter el caracter en la matriz y que me respente lo que haya, osea si me viene una a, meterlo y si despues viene una b, volverlo a meter, y que en encode 1 tenga "ab" o "a b" o algo asi. Muchas gracias. Salu2
48
« en: Lunes 1 de Junio de 2009, 18:58 »
A ver como el código lo has comentado, no he tenido problema en entenderlo, además asi se entiende bastante facil. He probado el codigo, pero en procesar de momento quiero que me imprima un blanco entre caracteres. Por ejemplo la entrada es: "aabb" y quiero que me imprima: "a a b b" Más que nada para probarlo y entenderlo todo bien. Este es el codigo que llevamos hasta ahora: .data Entrance: .space 80 encode1: .space 40 encode2: .space 40 decode: .space 80 msg1: .asciiz "Please insert the String: " msg2: .asciiz " " msg3: .asciiz "n String encode like: " msg4: .asciiz "n String decode like: " .text .globl main main: in: li $v0,4 la $a0,msg1 syscall #Almacenar el String en la matriz # Número de syscall ori $v0,$zero,8 # $a0 = buffer para guardar la cadena la $a0,Entrance # $a1 = tamaño a leer ori $a1,$zero,80 syscall #Imprimir la matriz # Número de syscall ori $v0,$zero,4 # $a0 = buffer a imprimir la $a0,Entrance syscall start: la $s0, Entrance sig_carac: lw $t0, 0($s0) beq $t0, $zero, fin # Si es el carácter de final de cadena, ya terminamos nop #la procesar,$v0 #jal $v0 # Si no, llamamos a la función procesar() jal procesar add $a0,$zero,$t0 # Pasando el primer parámetro a la función procesar() beq $zero,$zero,sig_carac # Siguiente carácter addiu $s0,$s0,1 # Apuntamos al siguiente carácter fin: nop procesar: #Número de syscall ori $v0,$zero,4 syscall li $v0,4 la $a0,msg2 syscall # Volvemos de la función jr $ra nop
Pues bien lo que da a la salida es otra cosa: aabb (Esto lo hace bien porque se lo he puesto arriba) aabb (null) Porque puede ser? Muchas gracias de nuevo. Salu2
49
« en: Lunes 1 de Junio de 2009, 16:55 »
Muchas gracias, la verdad es que no me ha costado entender tu codigo. Lo unico que tu usas un ori entre el registro $zero y el numero, supongo que $zero contiene todos ceros, no? asi al hacer un or logico inmediato con el numero, te lo guarda ya en el registro $v0, no es asi? yo usaba la sentencia li entre el registro y el numero, vamos que supongo que es lo mismo.
Ahora se supone que en Entrance, tengo el String, no es asi? pero para acceder al primer elemento del string, puedo acceder a el inmediatamente o tengo que hacer un desplazamiento asi, osea:
un dll, registro1, Entrance,2, o algo asi? Muchas gracias.
Salu2
50
« en: Lunes 1 de Junio de 2009, 12:27 »
Si uso PCSPIM, a ver tengo esto: # la $a0,msg1 # syscall # li $v0,8 # syscall # li $v0,4 # syscall
La primera lo que hace es que me imprime el msg1 en la consola. La segunda me captura por teclado un String. Y la tercer me imprime un String en la consola. syscall es una llamada al sistema, que por lo que veo, lo que hace depende de la sentencia anterior. Salu2
|
|
|