Programación General > ASM (Ensamblador)
RLE en ensamblador MIPS
manurodri189:
Antes de nada una pregunta, en $a0 tengo el primer caracter, para compararlo con el siguiente solamente tendría que compararlo con Entrance, que se supone que ya esta apuntando ahi, cierto?
Esto ya lo he entendido:
--- Citar ---al entrar en la función procesar, ¿qué estás haciendo? La llamada al sistema 4 imprime un cadena de caracteres, cuyo puntero es $a0. Pero en $a0... ¡¡tenemos un carácter (el código ASCII del carácter)!!. Y claro, en esa dirección de memoria no hay nada, por tanto no imprime nada :P Y luego imprimes msg2 que es un espacio.
--- Fin de la cita ---
Es como la etiqueta msg1, ya que msg1 es lo que almacenamos en $a0, y lo me me imprime es el mensaje, ya que msg1 apunta al mensaje, facil.
Pero lo de imprimir un solo caracter no sabria hacerlo, aunque en realidad no me vale para este ejercicio era solo para toquetear.
He continuado con el ejercicio a ver que tal:
--- Código: ASM ---procesar: beq $a0,Entrance, counter #si es igual incremento el contador $a1 y vamos a sig_caractnop#meter el caracter en encode1 $si es diferente#meter el contador en encode2jal sig_caract # Volvemos de la funciónjr $ranop counter:addi $a1,$a1,1jal sig_caract
Que tal pinta tiene esto? aunque no se meter el caracter en la matriz y que me respente lo que haya, osea si me viene una a, meterlo y si despues viene una b, volverlo a meter, y que en encode 1 tenga "ab" o "a b" o algo asi. Muchas gracias.
Salu2
manurodri189:
La comparacion no seria con entrance seria con $s0, ya que es el puntero al siguiente caracter, cierto? osea esta linea:
--- Código: ASM ---beq $a0,$s0, counter
Salu2
m0skit0:
--- Cita de: "manurodri189" ---en $a0 tengo el primer caracter, para compararlo con el siguiente solamente tendría que compararlo con Entrance
--- Fin de la cita ---
--- Cita de: "manurodri189" ---La comparacion no seria con entrance seria con $s0
--- Fin de la cita ---
Nop, tampoco :P En $s0 tienes un puntero a un carácter, y en $a0 tienes un carácter. Tendrías que cargar el carácter en algún registro para compararlo. Lo que te aconsejo es que pases $s0 como parámetro a la función procesar():
--- 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: lw $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 # Si no, llamamos a la función procesar() addiu $a1,$s0,1 # Pasando el segundo parámetro a la función procesar() beq $zero,$zero,sig_carac # Siguiente carácter addiu $s0,$s0,1 # Apuntamos al siguiente carácter ## 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: addiu $v0, $zero, $zero # Inicializamos valores de retorno addiu $v1, $zero, $a1 addiu $t1, $zero, $zero # Contador de caracteres iguales consecutivosprocesar_iguales: lw $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 Esto empieza a ponerse más interesante, no? :D Pruébalo a ver si funciona bien. Te aconsejo que pruebes paso a paso, así vas viendo lo que hacen las instrucciones, y ves los valores que hay en los registros, etc...
Otra cuestión: eso que has puesto de jal sig_caract dentro de procesar :huh: te va a montar follones como una casa. La función debe terminar con jr siempre.
manurodri189:
Creo que lo he entendido todo excepto esto:
--- Código: ASM ---jr $ra
Esto se supone que devuelve el flujo de control a la funcion que lo llamo anteriormente, no? osea a sig_caract, no?
Y otra cosa a la hora de almacenar las salidas lo deberia hacer en procesar_noiguales, no?
Por cierto no te preocupes por los nombres, luego tengo que traducirlo todo al ingles xDDD.
Muchas gracias de nuevo tio.
Salu2
PD: no serás de las pedroñeras, no?
manurodri189:
Bueno me he dispuesto a probarlo, y me salta el siguiente error al cargar el archivo:
Esto que significa?
Salu2
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa