• Martes 20 de Mayo de 2025, 02:09

Mostrar Mensajes

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

Páginas: 1 ... 38 39 [40] 41 42 ... 100
976
C/C++ / Re: creación de icono a partir de imagen
« en: Martes 9 de Junio de 2009, 10:58 »
Cita de: "antonio_18"
se podría poner, en vez de cuatro, nfils, que sería el número de filas, y ncolums, que sería número de columnas no??
Bueno, eso es evidente, pero teniendo en cuenta que la matriz es cuadrada:

Código: Text
  1. #define TAM_MATRIZ 4
  2. int matriz[TAM_MATRIZ][TAM_MATRIZ];
  3. int i,j;
  4. int suma[4] = {0,0,0,0};
  5.  
  6. /* Inicializaciones */
  7. [...]
  8.  
  9. for (i=0;i<TAM_MATRIZ;i++)
  10.     for(j=0;j<TAM_MATRIZ;j++)
  11.         if(i<TAM_MATRIZ/2)
  12.             if(j<TAM_MATRIZ/2)
  13.                 suma[0] += matriz[i][j];
  14.             else
  15.                 suma[1] += matriz[i][j];
  16.         else
  17.             if(j<TAM_MATRIZ/2)
  18.                 suma[2] += matriz[i][j];
  19.             else
  20.                 suma[3] += matriz[i][j];
  21.  
Y seguro, seguro que se puede optimizar, lo que pasa es que no tengo tiempo (ni ganas :P ) de comerme la cabeza con ello.

977
C/C++ / Re: creación de icono a partir de imagen
« en: Martes 9 de Junio de 2009, 10:20 »
Cita de: "antonio_18"
Eso sería sólo para cuando la matriz es de 4x4 no??
Es lo que preguntaste  :P De todas formas, si la matriz resultante siempre es de 2x2, el código te vale. Otra cosa distinta es que la matriz resultante sea la mitad de la de entrada...

978
C/C++ / Re: creación de icono a partir de imagen
« en: Martes 9 de Junio de 2009, 09:37 »
Ok, estamos de acuerdo  ^_^

Una manera que se me ocurre ahora por la mañana  -_-  sería:

Código: C
  1. int matriz[4][4];
  2. int i,j;
  3. int suma[4] = {0,0,0,0};
  4.  
  5. /* Inicializaciones */
  6. [...]
  7.  
  8. for (i=0;i<4;i++)
  9.     for(j=0;j<4;j++)
  10.         if(i<2)
  11.             if(j<2)
  12.                 suma[0] += matriz[i][j];
  13.             else
  14.                 suma[1] += matriz[i][j];
  15.         else
  16.             if(j<2)
  17.                 suma[2] += matriz[i][j];
  18.             else
  19.                 suma[3] += matriz[i][j];
  20.  
Esto es una porquería de algoritmo  :lol: , seguramente se pueda optimizar, pero lo pongo igualmente a lo mejor alguien tiene una idea mejor viéndolo; ahora mismo no caigo en nada.

Quedaría hacer la media e insertar los resultados en una matriz 2x2 como pretendes, pero eso ya son detalles nada más, ¿no?  ;)

Un saludo

979
C/C++ / Re: problema con matriz.
« en: Lunes 8 de Junio de 2009, 19:29 »
Cita de: "pollomariov"
¿necesariamente hay que iniciar en 0 en C hay alguna explicacion para ello?.
Sí, es así. Será mejor que te acostumbres  :P

Código: C
  1. printf("%s", alumnos[j]);
  2.  
Efectivamente. alumnos[j] es un carácter, no una cadena de caracteres, ya que lo has declarado como char alumnos[5]. Si lo que quieres es un vector de cadenas, debes declararlo como char* alumnos[5].

980
C/C++ / Re: creación de icono a partir de imagen
« en: Lunes 8 de Junio de 2009, 15:53 »
Ok, no te había entendido. Suponiendo la matriz de entrada como int matriz[4][4], sería cuestión de calcular la media de matriz[0-1][0-1], matriz[0-1][2-3], matriz[2-3][0-1] y matriz[2-3][2-3]. ¿Es eso?

981
C/C++ / Re: creación de icono a partir de imagen
« en: Lunes 8 de Junio de 2009, 13:09 »
Bueno, pero si los agrupas de 4 en 4 te va a quedar una matriz de 1x4 y no 2x2. Sería cuestión de agruparlos de otra forma.

982
C/C++ / Re: creación de icono a partir de imagen
« en: Lunes 8 de Junio de 2009, 12:31 »
Pásala de .ppm y .pgm a .bmp y luego a .ico

983
C/C++ / Re: creación de icono a partir de imagen
« en: Lunes 8 de Junio de 2009, 11:51 »
Un icono en Windows es muy parecido a una imagen BMP. Deberías buscar los formatos de fichero de ambos e implementar alguna forma de pasar de uno a otro  ;)

http://en.wikipedia.org/wiki/ICO_(file_format)
http://en.wikipedia.org/wiki/Windows_and_OS/2_bitmap

Saludos

984
¿Qué tiene que ver esto con VB6?  :P

Y si es para hoy por la tarde, pues ya podrías haber empezado antes...

985
Visual Basic 6.0 e inferiores / Re: almacenamiento de vectores
« en: Domingo 7 de Junio de 2009, 06:11 »
Para que Print se ejecute 7 veces debes ponerlo dentro del for. Pero te va a imprimir 7 veces lo mismo porque h no cambia dentro del bucle.

Igualmente ese código es muy raro... Basta con poner For i = 0 To 7 y quitarse Dim X(7) As Double de encima.

986
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Sábado 6 de Junio de 2009, 14:41 »
El tamaño, evidentemente, por tanto en 4 bytes podemos tener números más grandes que en un byte, ¿no? A la hora de operar no tienes ninguna diferencia.

987
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Sábado 6 de Junio de 2009, 13:10 »
Cita de: "manurodri189"
Que quieres decir con perdida de rango?
¿Qué diferencia hay entre un número de un byte y uno de una palabra?

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

988
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Viernes 5 de Junio de 2009, 17:35 »
Cita de: "manurodri189"
Pues el 2 lo he acabado usando porque con el 4 no me dejaba.
Normal, no existe el registro $a4  :P

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

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

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

989
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Viernes 5 de Junio de 2009, 14:21 »
Primero, te has olvidado de sw guarda 4 bytes y no 1, por tanto hay que avanzar el puntero 4 bytes y no 1  :P

Código: Text
  1.  #avanzo el puntero
  2.  
  3.     addiu $a3,$a3,1
  4.     addiu $a4,$a4,4
  5.  

Cita de: "manurodri189"
solamente tengo que cambiar el 4 por un 1
Eso 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:

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

PD: ¿qué paso con $a2? xD

990
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Viernes 5 de Junio de 2009, 13:28 »
Sigues cometiendo varios errores, incluído el del syscall  &lt;_&lt;

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  &lt;_&lt;

991
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Viernes 5 de Junio de 2009, 12:50 »
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  ;)

992
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Viernes 5 de Junio de 2009, 12:26 »
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?  &lt;_&lt;

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.

993
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Viernes 5 de Junio de 2009, 11:50 »
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  ^_^

994
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Viernes 5 de Junio de 2009, 10:49 »
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  &lt;_&lt;

995
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Jueves 4 de Junio de 2009, 20:50 »
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:  ;)

996
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Jueves 4 de Junio de 2009, 19:10 »
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

997
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Jueves 4 de Junio de 2009, 18:35 »
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  &lt;_&lt;

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.

998
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Jueves 4 de Junio de 2009, 18:15 »
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  &lt;_&lt;

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

999
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Jueves 4 de Junio de 2009, 12:55 »
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.  

1000
ASM (Ensamblador) / Re: RLE en ensamblador MIPS
« en: Jueves 4 de Junio de 2009, 10:54 »
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

Páginas: 1 ... 38 39 [40] 41 42 ... 100