• Viernes 29 de Marzo de 2024, 15:39

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

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #25 en: Jueves 4 de Junio de 2009, 10:29 »
0
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.

Cita de: "manurodri189"
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  ;)

Cita de: "manurodri189"
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.

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #26 en: Jueves 4 de Junio de 2009, 10:44 »
0
Cita de: "m0skit0"
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.

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

Citar
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 error. Pero habia mucho mas espacios, porque el error justamente ahi?

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #27 en: Jueves 4 de Junio de 2009, 10:54 »
0
Cita de: "manurodri189"
Me he asegurado de quitar todos los espacios tras las comas, y nada, sigue dando exactamente el mismo error
Cierto, mein fault! Es add y no addiu

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #28 en: Jueves 4 de Junio de 2009, 12:38 »
0
Ok, he cambiado esto:

Código: ASM
  1. procesar:
  2.      addiu $v0, $zero, $zero   # Inicializamos valores de retorno
  3.      addiu $v1, $zero, $a1
  4.      addiu $t1, $zero, $zero   # Contador de caracteres iguales consecutivos
  5.  

por esto:

Código: ASM
  1. procesar:
  2.      add $v0, $zero, $zero   # Inicializamos valores de retorno
  3.      add $v1, $zero, $a1
  4.      add $t1, $zero, $zero   # Contador de caracteres iguales consecutivos
  5.  

Ya que en los 3 me daba el mismo error.

Ahora ejecuto el programa con la cadena "aabb" y se vuelve loco.



Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #29 en: Jueves 4 de Junio de 2009, 12:55 »
0
Error mío otra vez... Si es que... Hay que usar lb y no lw puesto que trabajamos con bytes (caracteres). Perdona. Además hay más cambios, se ve que estaba empanao...

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.     lbu $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 diferente
  49.     ori $s0, $zero, $v1        # Actualizamos el puntero con el valor devuelto
  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.     lbu $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.  
« última modificación: Jueves 4 de Junio de 2009, 13:14 por m0skit0 »

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #30 en: Jueves 4 de Junio de 2009, 13:00 »
0
Perdona? no hombre, te estoy muy agradecido, no me pidas perdón encima coño  :lol:

Ahora me tengo que ir luego le hecho un ojo y me pongo con la función esa a ver que sale.

Salu2



manurodri189

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



m0skit0

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

¿Lo has ejecutado paso a paso? Mira a ver cuándo te da ese error. A ver si lo pruebo esta tarde...

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #33 en: Jueves 4 de Junio de 2009, 18:26 »
0
Ehhhh, estoy aprendiendo verdad? xDDDDD

Lo acabo de ejecutar paso a paso, y me salta justo aqui:



Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #34 en: Jueves 4 de Junio de 2009, 18:35 »
0
Pues tío, yo lo he ejecutado en MARS y no me salta nada de eso, de hecho funciona como debería. Y el error que me pones es del manejador de excepciones del PCSPIM  <_<

Vuelvo a poner el código por si he cambiado algo  :P

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.     lbu $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 diferente
  49.     or $s0, $zero, $v1        # Actualizamos el puntero con el valor devuelto
  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.     add $v0, $zero, $zero   # Inicializamos valores de retorno
  67.     add $v1, $zero, $a1
  68.     add $t1, $zero, $zero   # Contador de caracteres iguales consecutivos
  69. procesar_iguales:
  70.     lbu $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.  
Y si quieres prueba el MARS, que personalmente prefiero al PCSPIM, porque tiene una interfaz más intuitiva y más legible, se puede volcar la memoria, etc... : http://courses.missouristate.edu/KenVol ... wnload.htm

Eso sí, es un JAR (fistro! xD) y necesitarás una máquina virtual Java para que tire.

manurodri189

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

Citar
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



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #36 en: Jueves 4 de Junio de 2009, 19:10 »
0
Yo no sé qué pasa, si no copias bien el código, o cómo... Mira, he puesto que imprima el resultado, te vuelvo a postear el código y una captura del programa corriendo en el MARS. Si te sigue dando ese error en el PCSPIM coméntaselo a tu profe/jefe/loquesea.

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.     lbu $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.    
  47.     jal procesar          # Llamamos a la función procesar()
  48.     addiu $a1,$s0,1       # Pasando el segundo parámetro a la función procesar()
  49.    
  50.     addiu $a0,$v0,1
  51.     addiu $v0,$zero,1
  52.     syscall
  53.    
  54.     beq $zero,$zero,sig_carac  # Siguiente carácter diferente
  55.     or $s0, $zero, $v1        # Actualizamos el puntero con el valor devuelto
  56.  
  57. #
  58. # Exit
  59. #
  60. fin:
  61.     ori $v0,$zero,10   # Terminamos con exit
  62.     syscall
  63.  
  64. #
  65. # Procesar (habría que poner un nombre más explicativo :)
  66. #
  67. # Recibe un carácter y el puntero a una cadena
  68. # Cuenta cuántos caracteres iguales al pasado consecutivos hay en la cadena
  69. # Devuelve en $v0 el número de caracteres iguales
  70. # y en $v1 el puntero al primer carácter diferente encontrado
  71. procesar:
  72.     add $v0, $zero, $zero   # Inicializamos valores de retorno
  73.     add $v1, $zero, $a1
  74.     add $t1, $zero, $zero   # Contador de caracteres iguales consecutivos
  75. procesar_iguales:
  76.     lbu $t0, 0($a1)                    # Cargamos el siguiente carácter a comparar
  77.     bne $a0, $t0, procesar_noiguales   # Si no son iguales, terminamos
  78.     addiu $a1, $a1, 1                  # Apuntamos al siguiente carácter    
  79.     beq $zero, $zero, procesar_iguales
  80.     addiu $t1, $t1, 1                  # Si son iguales, aumentamos el contador en uno
  81.  
  82. procesar_noiguales:
  83.     add $v0, $v0, $t1   # Ponemos los valores de retorno
  84.     add $v1, $v1, $t1
  85. # Volvemos de la función
  86.     jr $ra
  87.     nop
  88.  
Y la captura:
[attachment=0:2y3tse4c]captura1.jpg[/attachment:2y3tse4c]
El uno que sale al final es por el ENTER, sólo es cuestión de suprimirlo o sustituír la comparación con ASCII cero por ASCII 10.

Ya me comentas, un saludo

PD: no puedo usar el PCSPIM en el curro porque necesita de instalación y no tengo permisos para ello
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #37 en: Jueves 4 de Junio de 2009, 19:32 »
0
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:

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



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #38 en: Jueves 4 de Junio de 2009, 20:50 »
0
Bueno, he averiguado lo que pasa. Esto pasa porque no haces caso a lo que digo  :P  :D No tienes activado el "delayed branching". Esto deberías dejarlo siempre puesto porque en la realidad los procesadores MIPS funcionan así.

Venga, a currar  :comp:  ;)

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #39 en: Viernes 5 de Junio de 2009, 10:25 »
0
Dios!!! era eso!!!. Si te escucho tio :rolleyes:  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:

Código: ASM
  1. add $t3,$zero,encode1 #almaceno el puntero encode1 en t3
  2. add $t4,$zero,encode2 #almaceno el puntero encode2 en t4
  3.  
  4. add $t4(0),$zero,$t1 #en la primera direccion almacendo el contador.
  5. add $t3(0),$zero,0($a0) #en la primera direccion almacendo el caracter.
  6.  
  7. #Avanzo los punteros a la siguiente posicion
  8.  
  9. addiu $t3,$zero,1
  10. addiu $t4,$zero,1
  11.  

Que te parece?

Salu2



m0skit0

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

Cita de: "manurodri189"
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():

Código: Text
  1. #
  2. # Codificar
  3. #
  4. start:
  5.     la $s0, Entrance  
  6. sig_carac:
  7.     lbu $s1, 0($s0)
  8.     beq $s1, $zero, fin   # Si es el carácter de final de cadena, ya terminamos
  9.     add $a0,$zero,$s1     # Pasando el primer parámetro a la función procesar()
  10.    
  11.     jal procesar          # Llamamos a la función procesar()
  12.     addiu $a1,$s0,1       # Pasando el segundo parámetro a la función procesar()
  13.    
  14.     add $a0,$zero,$s1  #El carácter en $a0
  15.     jal almacenar     # Llamamos a la función almacenar()
  16.     add $a1,$zero,$v0  # Ponemos el número de caracteres en $a1
  17.  
  18.     beq $zero,$zero,sig_carac  # Siguiente carácter diferente
  19.     or $s0, $zero, $v1        # Actualizamos el puntero con el valor devuelto
  20.  
  21. #
  22. # Exit
  23. #
  24. fin:
  25.     ori $v0,$zero,10   # Terminamos con exit
  26.     syscall
  27.  
Fíjate que he cambiado $t0 por $s1, así mantenemos el carácter en un registro y se lo podemos pasar a almacenar(), ya que procesar() modifica $t0. Por convenio, en MIPS los registros sX deben mantener el valor a la vuelta de la función, mientras que los tX no tienen por qué.

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  <_<

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #41 en: Viernes 5 de Junio de 2009, 11:37 »
0
Citar
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

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.

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

Vale vale, ya lo pillo, pense que te referias a otra cosa.

Citar
Bueno, ya me dices, un saludo :hola: 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.html

Creo 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:

Código: ASM
  1. almacenar:
  2.     la $s3, encode1  #almaceno la direccion de encode1 en s3, s3 es el puntero
  3.     la $s4, encode2  #almaceno la direccion de encode2 en s4, s4 es el puntero
  4.  
  5.     sw $t1,$s3   #meto el caracter en la primera direccion de s3
  6.     sw $s1,$s3   #meto el contador en la primera direccion de s4
  7.  
  8.     #avanzo el puntero
  9.  
  10.     addiu $s3,$zero,1
  11.     addiu $s3,$zero,1
  12.  

o esto:

Código: ASM
  1. almacenar:
  2.     la $s3, encode1  #almaceno la direccion de encode1 en s3, s3 es el puntero
  3.     la $s4, encode2  #almaceno la direccion de encode2 en s4, s4 es el puntero
  4.  
  5.     sb $t1,$s3   #meto el caracter en la primera direccion de s3
  6.     sb $s1,$s3   #meto el contador en la primera direccion de s4
  7.  
  8.     #avanzo el puntero
  9.  
  10.     addiu $s3,$zero,1
  11.     addiu $s3,$zero,1
  12.  

Y me casca, en el sb o sw, pero es que no encuentro otra instruccion de store que me pueda hacer eso.

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #42 en: Viernes 5 de Junio de 2009, 11:50 »
0
La diferencia entre sb y sw es muy simple: ambos guardan un registro en la memoria, pero sb guarda tan sólo el byte bajo mientras que sw guarda el registro entero (una palabra, 4 bytes). Así que evidentemente tenemos que usar sb para los caracteres (un carácter = un byte) y sw para los números (sólo para tener una rango más grande, se podría usar sb perfectamente). Tu problema radica en que tienes mal la sintaxis de sb (o sw, lb, lw, es la misma):

Código: Text
  1. sb registro, desplazamiento(registro_puntero)
  2.  
Y siempre es así, aunque el desplazamiento sea cero, hay que poner un cero.

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.

Ánimo, que ya casi lo tienes  ^_^

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #43 en: Viernes 5 de Junio de 2009, 12:06 »
0
Bien, creo que lo he entendido, ahora no me da fallo al ejecutarlo, pongo el método:

Código: ASM
  1. almacenar:
  2.     la $s3, encode1  #almaceno la direccion de encode1 en s3, s3 es el puntero
  3.     la $s4, encode2  #almaceno la direccion de encode2 en s4, s4 es el puntero
  4.  
  5.     #sb para caracter
  6.     #sw para los numeros
  7.     sb $t1,0($s3)   #meto el caracter en la primera direccion de s3
  8.     sw $s1,0($s3)   #meto el contador en la primera direccion de s4
  9.  
  10.     #avanzo el puntero
  11.  
  12.     addiu $s3,$zero,1
  13.     addiu $s3,$zero,1
  14.  
  15. # Volvemos de la función
  16.     jr $ra
  17.     nop
  18.  

Bien, no te entendi bien esto:

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

Código: ASM
  1. fin:
  2.  
  3.     ori $v0,$zero,4
  4.     la $a0,encode1
  5.     syscall
  6.  
  7.     ori $v0,$zero,4
  8.     la $a0,encode2
  9.     syscall
  10.  
  11.     ori $v0,$zero,10   # Terminamos con exit
  12.     syscall
  13.  

Pero el programa no imprime nada, osea que algo en almacenar no tira, porque creo que lo de imprimir si lo cogí.

Salu2



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #44 en: Viernes 5 de Junio de 2009, 12:26 »
0
Código: Text
  1. sb $t1,0($s3)   #meto el caracter en la primera direccion de s3
  2. sw $s1,0($s3)
  3.  
¿Esto qué es, tíooooooo? Primero, los argumentos de la función se pasan en a0 y a1, no sé qué haces almacenando t1 y s1  :huh: Además, estás usando s3 como puntero de desetino en ambos, ¿entonces para qué cargas s4?  <_<

Cita de: "manurodri189"
entonces seria mejor que usara los registros tX en la funcion almacenar en vez de los sX, no?
Sí, eso exactamente.

Cita de: "manurodri189"
Ahora intento imprimirlo para ver si lo he hecho bien:
Para ver si lo has hecho bien, depura paso a paso.

manurodri189

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



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #46 en: Viernes 5 de Junio de 2009, 12:50 »
0
Código: Text
  1. add $a0,$zero,$s1  #El carácter en $a0
  2. jal almacenar     # Llamamos a la función almacenar()
  3. add $a1,$zero,$v0  # Ponemos el número de caracteres en $a1
  4.  
En a0 el carácter, en a1 el número de caracteres. A ver si leemos  :P

Cita de: "manurodri189"
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  ;)

manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #47 en: Viernes 5 de Junio de 2009, 13:05 »
0
:ouch: vaya paciencia la tuya  :D

Salu2



manurodri189

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
Re: RLE en ensamblador MIPS
« Respuesta #48 en: Viernes 5 de Junio de 2009, 13:11 »
0
Ahora me pasa una cosa rarisima.

Dejo la funcion así:

Código: ASM
  1. almacenar:
  2.     la $t3, encode1  #almaceno la direccion de encode1 en s3, s3 es el puntero
  3.     la $t4, encode2  #almaceno la direccion de encode2 en s4, s4 es el puntero
  4.  
  5.     sb $a0,0($t3)   #meto el caracter en la primera direccion de s3
  6.     sw $a1,0($t4)   #meto el contador en la primera direccion de s4
  7.  
  8.     #avanzo el puntero
  9.  
  10.     addiu $t3,$zero,1
  11.     addiu $t4,$zero,1
  12.  
  13. # Volvemos de la función
  14.     jr $ra
  15.     nop
  16.  

y para finalizar el programa e imprimir asi:

Código: ASM
  1. fin:
  2.  
  3.     ori $v0,$zero,4
  4.     la $a0,encode1
  5.     syscall
  6.  
  7.     ori $v0,$zero,4
  8.     la $a0,encode2
  9.     syscall
  10.  
  11.     ori $v0,$zero,10   # Terminamos con exit
  12.     syscall
  13.  

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



m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: RLE en ensamblador MIPS
« Respuesta #49 en: Viernes 5 de Junio de 2009, 13:28 »
0
Sigues cometiendo varios errores, incluído el del syscall  <_<

Empecemos por la función:

Código: Text
  1.  #avanzo el puntero
  2.  
  3.     addiu $t3,$zero,1
  4.     addiu $t4,$zero,1
  5.  
¿Avanzas el puntero? Yo sólo veo que asignas t3 = 1  y t4 = 1. Eso no es avanzar el puntero. Además, el avance de los punteros tendrías devolver los punteros actualizados al programa principal, para no sobreescribir siempre el mismo valor. Y evidentemente actualizarlos en el programa principal.

Código: Text
  1. ori $v0,$zero,4
  2. la $a0,encode2
  3. syscall
  4.  
La función 4 de syscall imprime una cadena de caracteres, no un array de números  <_<