Si le pasas el valor22222AA tendría que devolver 522A.Muy bien, pero la pregunta es, si tengo que descodificar, ¿cómo sé que 522A es "22222AA" y no "A" 522 veces?
soy capaz de hacerlo en java, y no tardo muchoCon eso me vale. Pero tampoco voy a hacerlo yo, como puedes entender. Y si sabes hacerlo en Java, alguna idea tendrás de cómo empezarlo en MIPS.
por cierto tu mandasAquí no manda nadie, estamos para ayudar ^_^
Pero vamos de Mips lo que se dice Mips ni idea.Pues ya sabes lo que toca: ponerse a estudiar. Te puedes ahorrar el código en Java, pues como te he dicho, no te lo voy a traducir a MIPS. En todo caso te ayudaría con las dudas, o bien si controlas otro ensamblador, digamos x86, también podríamos ver. Pero si no tienes ni idea de ensamblador... mal vamos.
syscall es una llamada al sistema, que por lo que veo, lo que hace depende de la sentencia anterior.Bueno, te aclaro. syscall no hace lo que dice la sentencia anterior. Funciona así: http://www.inf.pucrs.br/~eduardob/disci ... codes.html (http://www.inf.pucrs.br/~eduardob/disciplinas/arqi/mips/syscall_codes.html" onclick="window.open(this.href);return false;)
Tiene buena pinta no?:good:
yo usaba la sentencia li entre el registro y el numero, vamos que supongo que es lo mismo.Bueno, li es una pseudoinstrucción, es decir, realmente no existe como tal, sino que se traduce en 2 instrucciones: lui + ori. Si te fijas en el código que ejecuta el SPIM lo verás. De todas formas, no importa mucho, hazlo como mejor te venga, aunque es útil practicar con varias formas porque así se coge más soltura con ensamblador ;)
Ahora se supone que en Entrance, tengo el String, no es asi?Sí señor ^_^ después del primer syscall que puse.
pero para acceder al primer elemento del string, puedo acceder a el inmediatamente o tengo que hacer un desplazamiento asiNo, para el primer elemento no debes hacer ningún desplazamiento. Entrance es un puntero al primer carácter de la cadena. Puedes acceder a él así, por ejemplo:
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 :P Y luego imprimes msg2 que es un espacio.
en $a0 tengo el primer caracter, para compararlo con el siguiente solamente tendría que compararlo con Entrance
La comparacion no seria con entrance seria con $s0Nop, tampoco :P En $s0 tienes un puntero a un carácter, y en $a0 tienes un carácter. Tendrías que cargar el carácter en algún registro para compararlo. Lo que te aconsejo es que pases $s0 como parámetro a la función procesar():
Y otra cosa a la hora de almacenar las salidas lo deberia hacer en procesar_noiguales, no?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 ;)
Bueno me he dispuesto a probarlo, y me salta el siguiente error al cargar el archivo:El PcSpim no es un programa ejemplar que digamos :lol: Quítale los espacios tras las comas.
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.
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 ;)
El PcSpim no es un programa ejemplar que digamos :lol: 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 errorCierto, mein fault! Es add y no addiu
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?Cierto <_<
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.
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.
seria tan facil como hacer: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 :P
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.Puedes hacerlo como te dé la gana, siempre que funcione, aunque al final voy a terminar haciéndolo todo yo :lol: Yo lo que digo es hacer otra función que se llame tras procesar(), por ejemplo llamada almacenar():
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 :P
Puedes hacerlo como te dé la gana, siempre que funcione, aunque al final voy a terminar haciéndolo todo yo :lol: 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.
Bueno, ya me dices, un saludo :hola: y mírate las instrucciones de MIPS bien <_<
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.
entonces seria mejor que usara los registros tX en la funcion almacenar en vez de los sX, no?Sí, eso exactamente.
Ahora intento imprimirlo para ver si lo he hecho bien:Para ver si lo has hecho bien, depura paso a paso.
Vale lo de a0 lo entiendo, es ciero que se pasaban por esos registros, aunque el caracter este también en s1.Sí, pero te tienes que atener a los parámetros de la función. Si usas la función en otro programa por ejemplo, $s1 no tiene por qué tener ese carácter. Piensa en la función como un programa aparte ;)
solamente tengo que cambiar el 4 por un 1Eso te imprime 1 número, no un vector de números. Tendrías que hacer un bucle de impresión. La cuestión es cuándo parar :lol:
independientemente de los errores en los or, la idea es esa, verdad?El error de los or es porque te has olvidado el $. Y la idea es algo así, aunque personalmente no lo haría de esa manera. Pero creo que así funcionaría. Ya me cuentas.
Pues el 2 lo he acabado usando porque con el 4 no me dejaba.Normal, no existe el registro $a4 :P
Asi que supongo que en encode1, tengo los caracteres, y en encode2, las veces que se repite.¿Supones? No necesitas suponer nada, tienes el contenido de la memoria a la vista, hombre...
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?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).
Por cierto recuerdo que el enter me lo contaba, como lo puedo eliminar de encode 1 y de encode2?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.
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).
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.
Que quieres decir con perdida de rango?¿Qué diferencia hay entre un número de un byte y uno de una palabra?
Osea antes de meterlo a encode, directamente no lo meto y listo, no?No puedes evitar que se meta, puesto que tú no controlas lo que hace la llamada al sistema. Lo único que te queda es quitarlo después de que la llamada al sistema lo hay metido en el buffer.
¿Qué diferencia hay entre un número de un byte y uno de una palabra?.
Corregido de la siguiente maner::huh: Mal again: add $a1,$zero,$v0 no se ejecuta antes de saltar a la función, sino una vez ejecutada... <_<
Tiene que haber más erroresSí, hay unos cuantos, pero sinceramente no te voy a hacer todo y me estoy cansando un poco... La de codificar funciona, así que vuelve a mirar las funciones que has hecho, sobre todo la de decodificar. Sólo tiene que hacer el proceso inverso a codificar, así que es sencillo. La vas a tener que hacer tú solito :brickwall:
Me has dicho que codificar funciona, pero creo que el almacenamiento en encode, no porque lo imprimo y no hace nada.Funciona bien codificar y almacenar. Míra los valores en la memoria. Por tanto tienes mal el procedimiento de impresión.
También he puesto el nop debajo de beq, porque tambien consume 8 al igual que jal.Todos los saltos son así.
Entrance String: aabbcc
String encode like: abc
String decode like: aabbcc
Y es a la hora de imprimir encode, y solo encode, porque los numeros me los imprime como caracteres extrañosEsto ya lo comentamos :lol: Estás usando la llamada al sistema 4, que es para imprimir cadenas de caracteres, no vectores de números.
Y es a la hora de imprimir encode, y solo encode, porque los numeros me los imprime como caracteres extraños
Entrance String: aaaabbbccc
String encode like: 0a0b0c
String decode like: aaaabbbccc
Pues ya funciona perfectamente tio!!!Me alegro, aunque no estoy muy seguro de si sabes cómo funciona... :P
Por cierto no me respondiste si eras de las pedroñeras xDDDDDJajajaja, no, qué va, soy marroquí :lol:
Cita de: "manurodri189"Pues ya funciona perfectamente tio!!!Me alegro, aunque no estoy muy seguro de si sabes cómo funciona... :PCita de: "manurodri189"Por cierto no me respondiste si eras de las pedroñeras xDDDDDJajajaja, no, qué va, soy marroquí :lol:
¡Saludos y suerte!