• Viernes 19 de Abril de 2024, 05:55

Autor Tema:  RLE en ensamblador MIPS  (Leído 23474 veces)

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
RLE en ensamblador MIPS
« en: Miércoles 20 de Mayo de 2009, 14:35 »
0
Pues eso necesito saber si alguno de vosotros sabe de ensamblador y me puede echar una mano.

Tengo que hacer un codificador y un decodificador, según el algoritmo RLE

http://es.wikipedia.org/wiki/RLE

Tiene que ser con MIPS, con el simulador PCSpim.

Tengo la certeza de que es realmente sencillo pero no se por donde puedo cogerlo.

A ver si alguno de vosotros me puede echar una mano.

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #1 en: Miércoles 20 de Mayo de 2009, 16:24 »
0
Yo sé MIPS, te puedo ayudar (que no hacer), pero tienes que especificar más el algoritmo. Por ejemplo, ¿qué pasa si el valor es un número?

A codificar:

Código: Text
  1. 22222AA
  2.  
Codificado:

Código: Text
  1. 522A
  2.  
¿5 "2" & 2 "A" / 522 "A"?

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #2 en: Miércoles 20 de Mayo de 2009, 16:32 »
0
Si es como has puesto.

Si le pasas el valor22222AA tendría que devolver 522A.

No quiero que me lo hagas, pero realmente no tengo ni idea, así que necesitaría ayuda.

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #3 en: Miércoles 20 de Mayo de 2009, 16:34 »
0
Cita de: "manurodri189"
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?

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #4 en: Miércoles 20 de Mayo de 2009, 18:39 »
0
Acabo de preguntarlo, y me acaba de responder lo siguiente:

Well, i can think of a few solutions:
> a) it can be a matter of what characters are valid: that is,
> we can assume that only letters can be encoded. So '2' as char is not valid.
> However, this is a dummy solution...
>
> b) it depends on the data structures you use. For instance,
> if you use 1 integer (3 bytes) to represent the number and
> 1 byte for the char, then you may have the following organization in memory:
>
> for each 4 consecutive bytes :
>
> [1 byte] [3 bytes] :
> [char] [integer]
>
>
> So , in your example, each byte would be :
>
> 32, 00 00 00 05
> 41, 00 00 00 02
>
>
> where, 32 is the ascii of '2'
> and 41 is the ascii of 'A'
>
>
> c) another solution is to keep all the chars together,
> in consecutive bytes and all the numbers together
> in a second array, where each integer is 4 bytes.
>
> So, for your example, you can define one array symbols:
> '2','A',...
> or with their ascii: 32,41,...
> and another array with their frequency:
> 5, 2, ...
> where each integer occupies 4 bytes.
>
> When your decode, you know that the first number corresponds to
>
>
> the first char, and so on,....
> (a) is too limited...
> I would prefer you do either b) or c), and I think c) is the easiest.

Osea la a, que tiene pinta de ser la más fácil descartada, la b la entiendo pero el dice que es la más difícil, y la c, no la entiendo.

Tu como lo ves? si no sabes ingles, me lo dices y te lo traduzco.

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #5 en: Jueves 21 de Mayo de 2009, 10:34 »
0
La a) es una cutrería, no me extraña que sea descartada. La b) y la c) son más adecuadas, pero no me parece que una sea más difícil que la otra.

La c), que no entiendes, lo que pretende es primero poner todos los caracteres diferentes seguidos y luego todos las frecuencias seguidas, en vez de intercalarlas.

Bueno, ahora decides tú cuál de las dos vas a preferir.

Saludos

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #6 en: Jueves 21 de Mayo de 2009, 14:25 »
0
Ok, si crees que la dificultad es la misma prefiero la b, que creo que es más correcta, y entiendo mejor.

Por cierto, se me olvidó mencionar, que no es necesario hacer 2 programas, con uno que codifique y decodifique seria suficiente. Osea la entrada seria esta:

22222AA

Y la salida esta:

522A
22222AA

Muchas gracias por ayudarme y aconsejarme tío, es muy importante para mi.

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #7 en: Jueves 21 de Mayo de 2009, 15:58 »
0
Bueno, yo preferiría hacer 2 programas por separado, luego ya podrás usarlos como subrutinas de otro principal  ;)

¿Cómo crees que sería el algoritmo de codificación? En pseudo-código, por ejemplo.

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #8 en: Jueves 21 de Mayo de 2009, 16:14 »
0
Pero en pseudocódigo es muy muy diferente, no? soy capaz de hacerlo en java, y no tardo mucho, si quieres lo hago para que veas que he captado la idea, pero no se de que puede servir eso, explicaté no lo entiendo, o es un pseudocódigo orientado a ensamblador?

Salu2

PD: por cierto tu mandas, si dices que 2 subrutinas por separado y un programa principal que es lo que ves mejor, pues así.



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #9 en: Jueves 21 de Mayo de 2009, 16:56 »
0
Cita de: "manurodri189"
soy capaz de hacerlo en java, y no tardo mucho
Con 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.

Cita de: "manurodri189"
por cierto tu mandas
Aquí no manda nadie, estamos para ayudar  ^_^

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #10 en: Jueves 21 de Mayo de 2009, 17:06 »
0
Ok, me llevara un tiempecito, porque también estoy liado con otra cosa, así que en un par de días o así postearé el código en java. Pero vamos de Mips lo que se dice Mips ni idea.

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #11 en: Jueves 21 de Mayo de 2009, 18:03 »
0
Cita de: "manurodri189"
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.

Un saludo

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #12 en: Lunes 1 de Junio de 2009, 11:44 »
0
Vamos a ver, ahora que he acabado lo demás me he puesto con esté ejercicio.

Primero lo que he decidido es que se introduzca la cadena por teclado, y la codificación se haga de esta manera:

Si se introduce la cadena "22222AA"

Pues se codifica como un array que contenga [2 A] y otro que contenga el numero de repeticiones [5 2]. Esto creo que serviria.

Ahora me he puesto con el codigo pero necesito ayuda, porque es que me cuesta la vida.

He empezado con esto:

Código: ASM
  1. .data
  2. Entrance: .space 80
  3. encode1: .space 40
  4. encode2: .space 40
  5. decode: .space 80
  6. msg1: .asciiz "Please insert the String: "
  7. msg2: .asciiz " "
  8. msg3: .asciiz "n String encode like: "
  9. msg4: .asciiz "n String decode like: "
  10. .text
  11. .globl main
  12.  
  13. main:
  14.  
  15. in:
  16. li $v0,4
  17. la $a0,msg1
  18. syscall
  19. li $v0,8
  20. syscall
  21. li $v0,4
  22. syscall
  23.  

Se supone que en $v0 tengo la cadena que he introducido por teclado no?

Lo que quiero es separar la cadena por caracteres, coger el primer carcter meterlo en el array encode1 y compararlo con el siguiente, y si es igual lo saco de la supuesta array auxiliar e incremento un contador, y si es distinto, lo saco del array y pongo el contador en el array encode2. Tiene buena pinta no?

Pues bueno el primer paso seria comparar los caracteres de la cadena que tengo supuestamente en $v0, dame una idea de como hacerlo por favor.

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #13 en: Lunes 1 de Junio de 2009, 12:22 »
0
A ver, primero... ¿Estás usando un simulador de MIPS (PCSPIM ¿?), o cómo? Porque entonces tienes que explicarme qué hace cada syscall, o postear la documentación del manejador de excepciones, que no soy adivino  :D

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #14 en: Lunes 1 de Junio de 2009, 12:27 »
0
Si uso PCSPIM, a ver tengo esto:

Código: ASM
  1. # la $a0,msg1
  2. # syscall
  3.  
  4. # li $v0,8
  5. # syscall
  6.  
  7. # li $v0,4
  8. # syscall
  9.  

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



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #15 en: Lunes 1 de Junio de 2009, 12:49 »
0
Cita de: "manurodri189"
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

Volviendo a tu código, generalmente se pone la sección de datos depués de la de texto (código), pero bueno, no importa. Para leer una cadena, fíjate en la tabla la llamada número 8. Debes poner en $a0 la dirección del buffer y en $a1 en número de caracteres que se van a leer + 1, algo que no haces, y que vendría a ser:

Código: Text
  1. # Número de syscall
  2. ori $v0,$zero,8
  3. # $a0 = buffer para guardar la cadena
  4. la $a0,Entrance
  5. # $a1 = tamaño a leer
  6. ori $a1,$zero,80
  7. syscall
  8.  
Ahora ya tienes almacenada la cadena (máximo 80 caracteres) en Entrace. Para imprimirla, es el syscall 4 con la dirección de la cadena en $a0, por tanto:

Código: Text
  1. # Número de syscall
  2. ori $v0,$zero,4
  3. # $a0 = buffer a imprimir
  4. la $a0,Entrance
  5. syscall
  6.  

Cita de: "manurodri189"
Tiene buena pinta no?
:good:

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #16 en: Lunes 1 de Junio de 2009, 16:55 »
0
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



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #17 en: Lunes 1 de Junio de 2009, 17:49 »
0
Cita de: "manurodri189"
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  ;)

Cita de: "manurodri189"
Ahora se supone que en Entrance, tengo el String, no es asi?
Sí señor  ^_^ después del primer syscall que puse.

Cita de: "manurodri189"
pero para acceder al primer elemento del string, puedo acceder a el inmediatamente o tengo que hacer un desplazamiento asi
No, 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:

Código: Text
  1. # Puntero de cadena a $s0
  2. la $s0,Entrance
  3. # Cargamos el primer carácter en $s0
  4. lw $t0,0($s0)
  5.  
Ojo, si tienes puesto el "delayed load" como opción en el PCSPIM, el registro destino de las instrucciones load (lw, lb, etc...) tardará una instrucción más en cargarse. Con poner un nop después del load lo apañas.

Para ir accediendo a todos los caracteres de la cadena, es bastante fácil (supondré que no hay "delayed load", pero sí "delayed jump"):

Código: Text
  1. start:
  2. la $s0, Entrance  
  3. sig_carac:
  4. lw $t0, 0($s0)
  5. beq $t0, $zero, fin   # Si es el carácter de final de cadena, ya terminamos
  6. nop
  7. la procesar,$v0
  8. jal $v0               # Si no, llamamos a la función procesar()
  9. add $a0,$zero,$t0     # Pasando el primer parámetro a la función procesar()
  10. beq $zero,$zero,sig_carac  # Siguiente carácter
  11. addiu $s0,$s0,1            # Apuntamos al siguiente carácter
  12. fin:
  13. nop
  14.  
  15. procesar:
  16. [...]
  17. # Volvemos de la función
  18. jr $ra
  19. nop
  20.  
PD: todo esto lo escribo ahora de pasada, está sin probar, así que si falla algo, dímelo  :P

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #18 en: Lunes 1 de Junio de 2009, 18:58 »
0
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:

Código: ASM
  1. .data
  2. Entrance: .space 80
  3. encode1: .space 40
  4. encode2: .space 40
  5. decode: .space 80
  6. msg1: .asciiz "Please insert the String: "
  7. msg2: .asciiz " "
  8. msg3: .asciiz "n String encode like: "
  9. msg4: .asciiz "n String decode like: "
  10. .text
  11. .globl main
  12.  
  13. main:
  14.  
  15. in:
  16.  
  17. li $v0,4
  18. la $a0,msg1
  19. syscall
  20.  
  21. #Almacenar el String en la matriz
  22. # Número de syscall
  23. ori $v0,$zero,8
  24. # $a0 = buffer para guardar la cadena
  25. la $a0,Entrance
  26. # $a1 = tamaño a leer
  27. ori $a1,$zero,80
  28. syscall
  29.  
  30. #Imprimir la matriz
  31. # Número de syscall
  32. ori $v0,$zero,4
  33. # $a0 = buffer a imprimir
  34. la $a0,Entrance
  35. syscall
  36.  
  37. start:
  38. la $s0, Entrance  
  39. sig_carac:
  40. lw $t0, 0($s0)
  41. beq $t0, $zero, fin   # Si es el carácter de final de cadena, ya terminamos
  42. nop
  43. #la procesar,$v0
  44. #jal $v0               # Si no, llamamos a la función procesar()
  45. jal procesar
  46. add $a0,$zero,$t0     # Pasando el primer parámetro a la función procesar()
  47. beq $zero,$zero,sig_carac  # Siguiente carácter
  48. addiu $s0,$s0,1            # Apuntamos al siguiente carácter
  49. fin:
  50. nop
  51.  
  52. procesar:
  53.  
  54.  
  55. #Número de syscall
  56. ori $v0,$zero,4
  57. syscall
  58.  
  59. li $v0,4
  60. la $a0,msg2
  61. syscall
  62.  
  63. # Volvemos de la función
  64. jr $ra
  65. nop
  66.  

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



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #19 en: Lunes 1 de Junio de 2009, 20:30 »
0
:no: me parece que no has entendido cómo funcionan las llamadas al sistema con syscall...

Código: Text
  1. procesar:
  2. #Número de syscall
  3. ori $v0,$zero,4
  4. syscall
  5.  
  6. li $v0,4
  7. la $a0,msg2
  8. syscall
  9.  
  10. # Volvemos de la función
  11. jr $ra
  12. nop
  13.  
Esto es lo que has puesto en la función procesar. Ten en cuenta que los registros $aX se usan para pasar los parámetros a la función, siendo $a0 el primer parámetro, $a1 el segundo, etc... Pues nuestra función procesar recibe un solo parámetro, en $a0 como hemos dicho, y es el carácter (cuando hacemos add $a0,$zero,$t0 copiamos $t0 en $a0, y $t0 tiene el carácter que estamos procesando). Ahora, al hacer:

Código: Text
  1. ori $v0,$zero,4
  2. syscall
  3.  
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. Ahora la cuestión es ¿cómo imprimir un solo carácter si la única función que tenemos es para imprimir cadenas? No olvides que las cadenas acaban con un carácter nulo...

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #20 en: Martes 2 de Junio de 2009, 18:58 »
0
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:

Citar
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.

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:

Código: ASM
  1. procesar:
  2.  
  3. beq $a0,Entrance, counter #si es igual incremento el contador $a1 y vamos a sig_caract
  4. nop
  5. #meter el caracter en encode1 $si es diferente
  6. #meter el contador en encode2
  7. jal sig_caract
  8.  
  9. # Volvemos de la función
  10. jr $ra
  11. nop
  12.  
  13. counter:
  14. addi $a1,$a1,1
  15. jal sig_caract
  16.  

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



manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #21 en: Martes 2 de Junio de 2009, 19:45 »
0
La comparacion no seria con entrance seria con $s0, ya que es el puntero al siguiente caracter, cierto? osea esta linea:

Código: ASM
  1. beq $a0,$s0, counter
  2.  

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #22 en: Miércoles 3 de Junio de 2009, 10:12 »
0
Cita de: "manurodri189"
en $a0 tengo el primer caracter, para compararlo con el siguiente solamente tendría que compararlo con Entrance
Cita de: "manurodri189"
La comparacion no seria con entrance seria con $s0
Nop, 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():

Código: Text
  1. .data
  2. Entrance: .space 80
  3. encode1: .space 40
  4. encode2: .space 40
  5. decode: .space 80
  6. msg1: .asciiz "Please insert the String: "
  7. msg2: .asciiz " "
  8. msg3: .asciiz "n String encode like: "
  9. msg4: .asciiz "n String decode like: "
  10. .text
  11. .globl main
  12.  
  13. #
  14. # Main
  15. #
  16. main:
  17.     ori $v0,$zero,4
  18.     la $a0,msg1
  19.     syscall
  20.  
  21. #Almacenar el String en la matriz
  22. # Número de syscall
  23.     ori $v0,$zero,8
  24. # $a0 = buffer para guardar la cadena
  25.     la $a0,Entrance
  26. # $a1 = tamaño a leer
  27.     ori $a1,$zero,80
  28.     syscall
  29.  
  30. #Imprimir la matriz
  31. # Número de syscall
  32.     ori $v0,$zero,4
  33. # $a0 = buffer a imprimir
  34.     la $a0,Entrance
  35.     syscall
  36.  
  37. #
  38. # Codificar
  39. #
  40. start:
  41.     la $s0, Entrance  
  42. sig_carac:
  43.     lw $t0, 0($s0)
  44.     beq $t0, $zero, fin   # Si es el carácter de final de cadena, ya terminamos
  45.     add $a0,$zero,$t0     # Pasando el primer parámetro a la función procesar()
  46.     jal procesar  # Si no, llamamos a la función procesar()
  47.     addiu $a1,$s0,1    # Pasando el segundo parámetro a la función procesar()
  48.     beq $zero,$zero,sig_carac  # Siguiente carácter
  49.     addiu $s0,$s0,1            # Apuntamos al siguiente carácter
  50.  
  51. #
  52. # Exit
  53. #
  54. fin:
  55.     ori $v0,$zero,10   # Terminamos con exit
  56.     syscall
  57.  
  58. #
  59. # Procesar (habría que poner un nombre más explicativo :)
  60. #
  61. # Recibe un carácter y el puntero a una cadena
  62. # Cuenta cuántos caracteres iguales al pasado consecutivos hay en la cadena
  63. # Devuelve en $v0 el número de caracteres iguales
  64. # y en $v1 el puntero al primer carácter diferente encontrado
  65. procesar:
  66.     addiu $v0, $zero, $zero   # Inicializamos valores de retorno
  67.     addiu $v1, $zero, $a1
  68.     addiu $t1, $zero, $zero   # Contador de caracteres iguales consecutivos
  69. procesar_iguales:
  70.     lw $t0, 0($a1)  # Cargamos el siguiente carácter a comparar
  71.     bne $a0, $t0, procesar_noiguales  # Si no son iguales, terminamos
  72.     addiu $a1, $a1, 1 # Apuntamos al siguiente carácter    
  73.     beq $zero, $zero, procesar_iguales
  74.     addiu $t1, $t1, 1  # Si son iguales, aumentamos el contador en uno
  75.  
  76. procesar_noiguales:
  77.     add $v0, $v0, $t1   # Ponemos los valores de retorno
  78.     add $v1, $v1, $t1
  79. # Volvemos de la función
  80.     jr $ra
  81.     nop
  82.  
Esto empieza a ponerse más interesante, no?  :D Pruébalo a ver si funciona bien. Te aconsejo que pruebes paso a paso, así vas viendo lo que hacen las instrucciones, y ves los valores que hay en los registros, etc...

Otra cuestión: eso que has puesto de jal sig_caract dentro de procesar :huh: te va a montar follones como una casa. La función debe terminar con jr siempre.

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #23 en: Jueves 4 de Junio de 2009, 09:57 »
0
Creo que lo he entendido todo excepto esto:

Código: ASM
  1. jr $ra
  2.  

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?



manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #24 en: Jueves 4 de Junio de 2009, 10:07 »
0
Bueno me he dispuesto a probarlo, y me salta el siguiente error al cargar el archivo:



Esto que significa?

Salu2