Programación General > ASM (Ensamblador)

 RLE en ensamblador MIPS

<< < (8/17) > >>

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

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:
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 ---.dataEntrance: .space 80encode1: .space 40encode2: .space 40decode: .space 80msg1: .asciiz "Please insert the String: "msg2: .asciiz " "msg3: .asciiz "n String encode like: "msg4: .asciiz "n String decode like: ".text.globl main ## Main#main:    ori $v0,$zero,4    la $a0,msg1    syscall #Almacenar el String en la matriz# Número de syscall    ori $v0,$zero,8# $a0 = buffer para guardar la cadena    la $a0,Entrance# $a1 = tamaño a leer    ori $a1,$zero,80    syscall #Imprimir la matriz# Número de syscall    ori $v0,$zero,4# $a0 = buffer a imprimir    la $a0,Entrance    syscall ## Codificar#start:    la $s0, Entrance  sig_carac:    lbu $t0, 0($s0)    beq $t0, $zero, fin   # Si es el carácter de final de cadena, ya terminamos    add $a0,$zero,$t0     # 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()        addiu $a0,$v0,1    addiu $v0,$zero,1    syscall        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 ## Procesar (habría que poner un nombre más explicativo :)## Recibe un carácter y el puntero a una cadena# Cuenta cuántos caracteres iguales al pasado consecutivos hay en la cadena# Devuelve en $v0 el número de caracteres iguales# y en $v1 el puntero al primer carácter diferente encontradoprocesar:    add $v0, $zero, $zero   # Inicializamos valores de retorno    add $v1, $zero, $a1    add $t1, $zero, $zero   # Contador de caracteres iguales consecutivosprocesar_iguales:    lbu $t0, 0($a1)                    # Cargamos el siguiente carácter a comparar    bne $a0, $t0, procesar_noiguales   # Si no son iguales, terminamos    addiu $a1, $a1, 1                  # Apuntamos al siguiente carácter        beq $zero, $zero, procesar_iguales    addiu $t1, $t1, 1                  # Si son iguales, aumentamos el contador en uno procesar_noiguales:    add $v0, $v0, $t1   # Ponemos los valores de retorno    add $v1, $v1, $t1# Volvemos de la función    jr $ra    nop 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

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

He probado con 2 ordenadores diferentes, no puedo imaginar cual es el problema.

Salu2

PD: es profesor.

m0skit0:
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:
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 ---add $t3,$zero,encode1 #almaceno el puntero encode1 en t3add $t4,$zero,encode2 #almaceno el puntero encode2 en t4 add $t4(0),$zero,$t1 #en la primera direccion almacendo el contador.add $t3(0),$zero,0($a0) #en la primera direccion almacendo el caracter. #Avanzo los punteros a la siguiente posicion addiu $t3,$zero,1addiu $t4,$zero,1 
Que te parece?

Salu2

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa