• Viernes 15 de Noviembre de 2024, 12:59

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

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #75 en: Sábado 13 de Junio de 2009, 18:12 »
0
Tienes toda la razon, tio.

De hecho ya he acabado el programa, y se que funciona, gracias a la ejecucion paso a paso, y a lo que me pone en los registros.

El almacenar_salida, como preveia estaba mal y como se supone que entendí el código que me pasaste de decodificar, pues he visto que cometia los mismos errores que comentabas antes, lo de leer en vez de escribir y demas.

Aqui pongo el codigo que me ha quedado de almacenar_salida, pero ya te digo que funciona, porque lo he probado.

Código: ASM
  1. almacenar_salida:
  2.     la $a0,encode1
  3.     la $a1,encode2
  4.     la $a3,encode
  5.     or $t0,$zero,$a0   # encode1
  6.     or $t1,$zero,$a1   # encode2
  7.     or $t2,$zero,$a3   # encode
  8.  
  9.  
  10. while:
  11.  
  12.     lbu $t3,0($t0)  # Carácter de "encode1" -> T3    
  13.     addiu $t0,$t0,1  # Avanzamos puntero
  14.     lbu $t4,0($t1)  # Numero de "encode2" -> T4  
  15.  
  16.     beq $t3,$zero,finwhile    #si es el caracter vacio acabo
  17.     nop
  18.     sb $t4,0($t2)              #cargo el primer numero en encode
  19.     addiu $t2,$t2,1             #avanzo el puntero de encode
  20.     sb $t3,0($t2)              #cargo el caracter en encode
  21.  
  22.     #avanzo todos los punteros
  23.     addiu $t1,$t1,1
  24.     addiu $t2,$t2,1
  25.  
  26.     b while                   #llamo a while de nuevo
  27.     nop
  28.  

Ahora solo tengo un pequeño problemilla que no se a que se debe. Y es a la hora de imprimir encode, y solo encode, porque los numeros me los imprime como caracteres extraños, no se si será por el syscall o porque, pero solo me pasa con el encode, ya que si imprimo el decode de la misma manera funciona perfectamente.

Lo imprimo así:

Código: ASM
  1. #Imprimir la matriz de salida codificada
  2.     # Número de syscall
  3.     ori $v0,$zero,4
  4.     # $a0 = buffer a imprimir
  5.     la $a0,encode
  6.     syscall
  7.  

Y da como salida esto:

Citar
Entrance String: aabbcc

 String encode like: abc

 String decode like: aabbcc

Te pego todo el programa acabado a falta de eso:

Código: ASM
  1. .data
  2. Entrance: .space 80
  3. encode1: .space 40
  4. encode2: .space 40
  5. encode: .space 40
  6. decode: .space 80
  7. msg1: .asciiz "Please insert the String: "
  8. msg2: .asciiz "n"
  9. msg3: .asciiz "n String encode like: "
  10. msg4: .asciiz "n String decode like: "
  11. msg5: .asciiz "n Entrance String: "
  12. .text
  13. .globl main
  14.  
  15. #
  16. # Main
  17. #
  18. main:
  19.     ori $v0,$zero,4
  20.     la $a0,msg1
  21.     syscall
  22.  
  23. #Almacenar el String en la matriz
  24. # Número de syscall
  25.     ori $v0,$zero,8
  26. # $a0 = buffer para guardar la cadena
  27.     la $a0,Entrance
  28. # $a1 = tamaño a leer
  29.     ori $a1,$zero,80
  30.     syscall
  31.  
  32. la $a0,Entrance
  33. jal eliminar_enter
  34. nop
  35.  
  36. ori $v0,$zero,4
  37.     la $a0,msg5
  38.     syscall
  39.  
  40. #Imprimir la matriz
  41. # Número de syscall
  42.     ori $v0,$zero,4
  43. # $a0 = buffer a imprimir
  44.     la $a0,Entrance
  45.     syscall
  46.  
  47. ori $v0,$zero,4
  48.     la $a0,msg2
  49.     syscall
  50.  
  51. #
  52. # Codificar
  53. #
  54. start:
  55.     la $s0, Entrance
  56.     la $s3, encode1  #almaceno la direccion de encode1 en s3, s3 es el puntero
  57.     la $s4, encode2  #almaceno la direccion de encode2 en s4, s4 es el puntero
  58.     or $a3,$zero,$s3
  59.     or $a2,$zero,$s4
  60.  
  61. sig_carac:
  62.     lbu $s1, 0($s0)
  63.     beq $s1, $zero, fin   # Si es el carácter de final de cadena, ya terminamos
  64.     add $a0,$zero,$s1     # Pasando el primer parámetro a la función procesar()
  65.    
  66.     jal procesar          # Llamamos a la función procesar()
  67.     addiu $a1,$s0,1       # Pasando el segundo parámetro a la función procesar()
  68.    
  69.     add $a0,$zero,$s1  #El carácter en $a0
  70.     addiu $v0,$v0,1    #sumamos 1 a v0
  71.     jal almacenar     # Llamamos a la función almacenar()
  72.     add $a1,$zero,$v0  # Ponemos el número de caracteres en $a1
  73.    
  74.     beq $zero,$zero,sig_carac  # Siguiente carácter diferente
  75.     or $s0, $zero, $v1        # Actualizamos el puntero con el valor devuelto
  76.  
  77. #
  78. # Exit
  79. #
  80. fin:
  81.  
  82.     jal almacenar_salida
  83.     nop
  84.  
  85.     ori $v0,$zero,4
  86.     la $a0,msg3
  87.     syscall
  88.  
  89.     #Imprimir la matriz
  90.     # Número de syscall
  91.     ori $v0,$zero,4
  92.     # $a0 = buffer a imprimir
  93.     la $a0,encode
  94.     syscall
  95.  
  96.     ori $v0,$zero,4
  97.     la $a0,msg2
  98.     syscall
  99.  
  100.     jal decodificar
  101.     nop
  102.  
  103.     ori $v0,$zero,4
  104.     la $a0,msg4
  105.     syscall
  106.  
  107.     #Imprimir la matriz
  108.     # Número de syscall
  109.     ori $v0,$zero,4
  110.     # $a0 = buffer a imprimir
  111.     la $a0,decode
  112.     syscall
  113.  
  114.     ori $v0,$zero,4
  115.     la $a0,msg2
  116.     syscall
  117.  
  118.     ori $v0,$zero,10   # Terminamos con exit
  119.     syscall
  120.  
  121. #
  122. # Procesar (habría que poner un nombre más explicativo :)
  123. #
  124. # Recibe un carácter y el puntero a una cadena
  125. # Cuenta cuántos caracteres iguales al pasado consecutivos hay en la cadena
  126. # Devuelve en $v0 el número de caracteres iguales
  127. # y en $v1 el puntero al primer carácter diferente encontrado
  128. procesar:
  129.     add $v0, $zero, $zero   # Inicializamos valores de retorno
  130.     add $v1, $zero, $a1
  131.     add $t1, $zero, $zero   # Contador de caracteres iguales consecutivos
  132. procesar_iguales:
  133.     lbu $t0, 0($a1)                    # Cargamos el siguiente carácter a comparar
  134.     bne $a0, $t0, procesar_noiguales   # Si no son iguales, terminamos
  135.     addiu $a1, $a1, 1                  # Apuntamos al siguiente carácter    
  136.     beq $zero, $zero, procesar_iguales
  137.     addiu $t1, $t1, 1                  # Si son iguales, aumentamos el contador en uno
  138.  
  139. procesar_noiguales:
  140.     add $v0, $v0, $t1   # Ponemos los valores de retorno
  141.     add $v1, $v1, $t1
  142.  
  143.  
  144. # Volvemos de la función
  145.     jr $ra
  146.     nop
  147.  
  148.  
  149. almacenar:
  150.  
  151.     sb $a0,0($a3)   #meto el caracter en la primera direccion de a3
  152.     sb $a1,0($a2)   #meto el contador en la primera direccion de a4
  153.  
  154.     #avanzo el puntero
  155.  
  156.     addiu $a3,$a3,1
  157.     addiu $a2,$a2,1
  158.  
  159.  
  160.  
  161. # Volvemos de la función
  162.     jr $ra
  163.     nop
  164.  
  165. almacenar_salida:
  166.     la $a0,encode1
  167.     la $a1,encode2
  168.     la $a3,encode
  169.     or $t0,$zero,$a0   # encode1
  170.     or $t1,$zero,$a1   # encode2
  171.     or $t2,$zero,$a3   # encode
  172.  
  173.  
  174. while:
  175.  
  176.     lbu $t3,0($t0)  # Carácter de "encode1" -> T3    
  177.     addiu $t0,$t0,1  # Avanzamos puntero
  178.     lbu $t4,0($t1)  # Numero de "encode2" -> T4  
  179.  
  180.     beq $t3,$zero,finwhile    #si es el caracter vacio acabo
  181.     nop
  182.     sb $t4,0($t2)              #cargo el primer numero en encode
  183.     addiu $t2,$t2,1             #avanzo el puntero de encode
  184.     sb $t3,0($t2)              #cargo el caracter en encode
  185.  
  186.     #avanzo todos los punteros
  187.     addiu $t1,$t1,1
  188.     addiu $t2,$t2,1
  189.  
  190.     b while                   #llamo a while de nuevo
  191.     nop
  192.  
  193. finwhile:
  194.  
  195.     sb $zero, 0($t2)   # Escribimos el carácter de fin de cadena
  196.     jr $ra
  197.     nop
  198.  
  199.  
  200. # void EliminarEnter(char* entrada)
  201. eliminar_enter:
  202.     li $t1,0xA
  203. ee_bucle:
  204.     lbu $t0,0($a0)
  205.     beq $t0,0xA,fin_ee
  206.     addiu $a0,$a0,1
  207.     beq $zero,$zero,ee_bucle
  208.     nop
  209. fin_ee:
  210.     jr $ra
  211.     sb $zero,-1($a0)
  212.  
  213.  
  214. decodificar:
  215.     # cargamos los parámetros en otros registros
  216.     la $a2,decode
  217.     la $a0,encode1
  218.     la $a1,encode2
  219.     or $t0,$zero,$a0   # encode1
  220.     or $t1,$zero,$a1   # encode2
  221.     or $t2,$zero,$a2   # decode
  222.  
  223.     lbu $t3,0($t0)  # Carácter de "encode1" -> T3    
  224.     addiu $t0,$t0,1  # Avanzamos puntero
  225.  
  226. decode_while1:    
  227.     beq $t3,$zero,fin_dec_while1  # Mientras no sea fin de cadena
  228.     nop
  229.     lbu $t4, 0($t1)  # Número de repeticiones del carácter
  230.     addiu $t1,$t1,1  # Avanzamos de elemento
  231.  
  232. decode_while2:
  233.     beq $t4,$zero,fin_dec_while2  # Mientras el número de caracteres no sea cero
  234.     nop
  235.     sb $t3, 0($t2)   # Escribimos el carácter en decode
  236.     addiu $t2,$t2,1  # Avanzamos el puntero móvil de decode
  237.     beq $zero,$zero, decode_while2  # Repetimos
  238.     addiu $t4,$t4,-1  # Restamos uno al número de caracteres
  239.  
  240. fin_dec_while2:    
  241.     lbu $t3,0($t0)  # Carácter de "encode1" -> T3    
  242.     beq $zero,$zero,decode_while1
  243.     addiu $t0,$t0,1  # Avanzamos puntero
  244.  
  245. fin_dec_while1:
  246.     sb $zero, 0($t2)   # Escribimos el carácter de fin de cadena
  247.     jr $ra
  248.     nop
  249.  
  250.  

Saludos y muchas gracias de nuevo.



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #76 en: Sábado 13 de Junio de 2009, 20:11 »
0
Cita de: "manurodri189"
Y es a la hora de imprimir encode, y solo encode, porque los numeros me los imprime como caracteres extraños
Esto ya lo comentamos  :lol: Estás usando la llamada al sistema 4, que es para imprimir cadenas de caracteres, no vectores de números.

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #77 en: Sábado 13 de Junio de 2009, 20:22 »
0
Lo comentamos pero no me cuadra, si yo quiero que sean caracteres?

Como habria que hacer para imprimirlo entonces? un bucle que imprimar caracter a caracter? o como?

Salu2

Edito: me refiero a que si yo en vez de letras meto numeros, tal que 22233 la codificacion se imprimiria como:

#2#3 siendo la# caracter extraño

y la decodificacion me la hace bien, y tambien imprime numeros.



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #78 en: Sábado 13 de Junio de 2009, 21:05 »
0
Código: Text
  1. almacenar_salida:
  2.     la $a0,encode1
  3.     la $a1,encode2
  4.     la $a3,encode
  5.  
:ph34r:  :ph34r:  :ph34r:  veo que no quieres comprender cómo pasar parámetros a las funciones. Esto no va aquí, sino en la llamada a la función. Pero bueno, si no quieres hacer caso, tú mismo :P

Cita de: "manurodri189"
Y es a la hora de imprimir encode, y solo encode, porque los numeros me los imprime como caracteres extraños

Tienes una ligera confusión sobre caracteres y valores. Lo que has escrito en encode1 son caracteres, independientemente de que representen números, letras, puntuaciones o ideogramas chinos. Pero en la memoria lo que tienes no es una 'A' o una '@', evidentemente, sino números, valores. En caso de los caracteres es el código ASCII. Por tanto la llamada del sistema de impresión de cadenas de caracteres relaciona cada código con el carácter que el corresponda (un dibujo al fin y al cabo) y lo imprime. Si queremos podemos cambiar las correspondencias código-carácter e incluso usar otros caracteres en vez de los estándar.

Pero si usamos encode2 en la llamada al sistema de impresión de cadenas de caracteres, tenemos un problema, porque lo que hay en memoria son números, no caracteres. Si le sumas a cada elemento de encode2 0x30 antes de imprimirlo, verás cómo sí que funciona bien  :blink:  A ver si sabes por qué...  ;)

PD: y lo que dices que se ve 00 02 en los cuadraditos... ¡qué misterio! :lol: Son caracteres Unicode para los que tu sistema no encuentra fuente, por tanto te pone el código. Y como puedes ver son los números, pero no los caracteres (como te he explicado más arriba).

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #79 en: Sábado 13 de Junio de 2009, 21:22 »
0
Cierto tio, me cuesta aprender, no es que no te haga caso xDDDD ahora lo cambio.

Si le sumo 0x30 a cada numero antes de almacenarlo dices que lo imprime, tiene que ser porque en Hexadecimal el 32, es el 2, y el 36, el 6 y así, no?

Solamente tendria que meter la sentencia addiu aqui?

Código: ASM
  1. beq $t3,$zero,finwhile    #si es el caracter vacio acabo
  2.     nop
  3.     addiu $t4,$zero,0x30         #sumo 30 para luego poder imprimirlo
  4.     sb $t4,0($t2)              #cargo el primer numero en encode
  5.     addiu $t2,$t2,1             #avanzo el puntero de encode
  6.     sb $t3,0($t2)              #cargo el caracter en encode
  7.  
  8.  

La salida es esta:

Citar
Entrance String: aaaabbbccc

 String encode like: 0a0b0c

 String decode like: aaaabbbccc

Porque me imprime 0s cuando tiene que imprimr los numeros correspondientes? supongo  que la 0x30 no se puede sumar asi, verdad? como se le suma?

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #80 en: Sábado 13 de Junio de 2009, 21:28 »
0
Ahi estás poniendo un 0x30 en el registro (lo suams con un cero),no sumándole un 0x30  <_<

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #81 en: Sábado 13 de Junio de 2009, 21:40 »
0
Dios!!! estoy en la parra.

Pues ya funciona perfectamente tio!!!. Ahora solo me falta traducirlo al ingles y listo.

Te vuelvo a dar las gracias por todo.

Por cierto no me respondiste si eras de las pedroñeras xDDDDD

Venga crack!!! estamos para lo que quieras, si necesitas cualquier cosa ya sabes donde encontrarme.

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #82 en: Domingo 14 de Junio de 2009, 11:55 »
0
Cita de: "manurodri189"
Pues ya funciona perfectamente tio!!!
Me alegro, aunque no estoy muy seguro de si sabes cómo funciona...  :P

Cita de: "manurodri189"
Por cierto no me respondiste si eras de las pedroñeras xDDDDD
Jajajaja, no, qué va, soy marroquí  :lol:

¡Saludos y suerte!

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #83 en: Domingo 14 de Junio de 2009, 12:49 »
0
Cita de: "m0skit0"
Cita de: "manurodri189"
Pues ya funciona perfectamente tio!!!
Me alegro, aunque no estoy muy seguro de si sabes cómo funciona...  :P

Cita de: "manurodri189"
Por cierto no me respondiste si eras de las pedroñeras xDDDDD
Jajajaja, no, qué va, soy marroquí  :lol:

¡Saludos y suerte!

Creo que aunque es la primera vez, le estoy cogiendo la dinámica, y creo que me he enterado de todo. Seguro que si tengo que volver a hacer un programa en MIPS, me costaría menos que esta vez.

Se lo envié ayer al profesor, y dice que esta muy contento con el trabajo, y que si estoy interesado en proyectos de este tipo, una vez que vuelva a España, que podemos trabajar juntos, hacer publicaciones y demás. Pero vamos aunque la idea no me disgusta, cuando vuelva a España tengo muchas cosas que hacer, así que lo rechazaré por el momento, en el futuro quien sabe.

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #84 en: Lunes 15 de Junio de 2009, 11:12 »
0
Ojo, si no se practica se pierde, como todo.

Saludos y enhorabuena  ^_^