Programación General > ASM (Ensamblador)

 RLE en ensamblador MIPS

<< < (9/17) > >>

m0skit0:

--- Cita de: "manurodri189" ---seria tan facil como hacer:
--- Fin de la cita ---
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.
--- Fin de la cita ---
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 ---## Codificar#start:    la $s0, Entrance  sig_carac:    lbu $s1, 0($s0)    beq $s1, $zero, fin   # Si es el carácter de final de cadena, ya terminamos    add $a0,$zero,$s1     # Pasando el primer parámetro a la función procesar()       jal procesar          # Llamamos a la función procesar()    addiu $a1,$s0,1       # Pasando el segundo parámetro a la función procesar()       add $a0,$zero,$s1  #El carácter en $a0    jal almacenar     # Llamamos a la función almacenar()    add $a1,$zero,$v0  # Ponemos el número de caracteres en $a1     beq $zero,$zero,sig_carac  # Siguiente carácter diferente    or $s0, $zero, $v1        # Actualizamos el puntero con el valor devuelto ## Exit#fin:    ori $v0,$zero,10   # Terminamos con exit    syscall 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:

--- 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
--- Fin de la cita ---

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.
--- Fin de la cita ---

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  <_<
--- Fin de la cita ---

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 ---almacenar:    la $s3, encode1  #almaceno la direccion de encode1 en s3, s3 es el puntero    la $s4, encode2  #almaceno la direccion de encode2 en s4, s4 es el puntero     sw $t1,$s3   #meto el caracter en la primera direccion de s3    sw $s1,$s3   #meto el contador en la primera direccion de s4     #avanzo el puntero     addiu $s3,$zero,1    addiu $s3,$zero,1 
o esto:


--- Código: ASM ---almacenar:    la $s3, encode1  #almaceno la direccion de encode1 en s3, s3 es el puntero    la $s4, encode2  #almaceno la direccion de encode2 en s4, s4 es el puntero     sb $t1,$s3   #meto el caracter en la primera direccion de s3    sb $s1,$s3   #meto el contador en la primera direccion de s4     #avanzo el puntero     addiu $s3,$zero,1    addiu $s3,$zero,1 
Y me casca, en el sb o sw, pero es que no encuentro otra instruccion de store que me pueda hacer eso.

Salu2

m0skit0:
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 ---sb registro, desplazamiento(registro_puntero) 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:
Bien, creo que lo he entendido, ahora no me da fallo al ejecutarlo, pongo el método:


--- Código: ASM ---almacenar:    la $s3, encode1  #almaceno la direccion de encode1 en s3, s3 es el puntero    la $s4, encode2  #almaceno la direccion de encode2 en s4, s4 es el puntero     #sb para caracter    #sw para los numeros    sb $t1,0($s3)   #meto el caracter en la primera direccion de s3    sw $s1,0($s3)   #meto el contador en la primera direccion de s4     #avanzo el puntero     addiu $s3,$zero,1    addiu $s3,$zero,1 # Volvemos de la función    jr $ra    nop 
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.
--- Fin de la cita ---

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 ---fin:     ori $v0,$zero,4    la $a0,encode1    syscall     ori $v0,$zero,4    la $a0,encode2    syscall     ori $v0,$zero,10   # Terminamos con exit    syscall 
Pero el programa no imprime nada, osea que algo en almacenar no tira, porque creo que lo de imprimir si lo cogí.

Salu2

m0skit0:

--- Código: Text ---sb $t1,0($s3)   #meto el caracter en la primera direccion de s3sw $s1,0($s3) ¿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?
--- Fin de la cita ---
Sí, eso exactamente.


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

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa