Programación General > ASM (Ensamblador)

 RLE en ensamblador MIPS

<< < (4/17) > >>

m0skit0:

--- Cita de: "manurodri189" ---syscall es una llamada al sistema, que por lo que veo, lo que hace depende de la sentencia anterior.
--- Fin de la cita ---
Bueno, te aclaro. syscall no hace lo que dice la sentencia anterior. Funciona así: http://www.inf.pucrs.br/~eduardob/disci ... codes.html

Volviendo a tu código, generalmente se pone la sección de datos depués de la de texto (código), pero bueno, no importa. Para leer una cadena, fíjate en la tabla la llamada número 8. Debes poner en $a0 la dirección del buffer y en $a1 en número de caracteres que se van a leer + 1, algo que no haces, y que vendría a ser:


--- Código: Text ---# Número de syscallori $v0,$zero,8# $a0 = buffer para guardar la cadenala $a0,Entrance# $a1 = tamaño a leerori $a1,$zero,80syscall Ahora ya tienes almacenada la cadena (máximo 80 caracteres) en Entrace. Para imprimirla, es el syscall 4 con la dirección de la cadena en $a0, por tanto:


--- Código: Text ---# Número de syscallori $v0,$zero,4# $a0 = buffer a imprimirla $a0,Entrancesyscall 

--- Cita de: "manurodri189" ---Tiene buena pinta no?
--- Fin de la cita ---
:good:

manurodri189:
Muchas gracias, la verdad es que no me ha costado entender tu codigo. Lo unico que tu usas un ori entre el registro $zero y el numero, supongo que $zero contiene todos ceros, no? asi al hacer un or logico inmediato con el numero, te lo guarda ya en el registro $v0, no es asi? yo usaba la sentencia li entre el registro y el numero, vamos que supongo que es lo mismo.

Ahora se supone que en Entrance, tengo el String, no es asi? pero para acceder al primer elemento del string, puedo acceder a el inmediatamente o tengo que hacer un desplazamiento asi, osea:

un dll, registro1, Entrance,2, o algo asi? Muchas gracias.

Salu2

m0skit0:

--- Cita de: "manurodri189" ---yo usaba la sentencia li entre el registro y el numero, vamos que supongo que es lo mismo.
--- Fin de la cita ---
Bueno, li es una pseudoinstrucción, es decir, realmente no existe como tal, sino que se traduce en 2 instrucciones: lui + ori. Si te fijas en el código que ejecuta el SPIM lo verás. De todas formas, no importa mucho, hazlo como mejor te venga, aunque es útil practicar con varias formas porque así se coge más soltura con ensamblador  ;)


--- Cita de: "manurodri189" ---Ahora se supone que en Entrance, tengo el String, no es asi?
--- Fin de la cita ---
Sí señor  ^_^ después del primer syscall que puse.


--- Cita de: "manurodri189" ---pero para acceder al primer elemento del string, puedo acceder a el inmediatamente o tengo que hacer un desplazamiento asi
--- Fin de la cita ---
No, para el primer elemento no debes hacer ningún desplazamiento. Entrance es un puntero al primer carácter de la cadena. Puedes acceder a él así, por ejemplo:


--- Código: Text ---# Puntero de cadena a $s0la $s0,Entrance# Cargamos el primer carácter en $s0lw $t0,0($s0) Ojo, si tienes puesto el "delayed load" como opción en el PCSPIM, el registro destino de las instrucciones load (lw, lb, etc...) tardará una instrucción más en cargarse. Con poner un nop después del load lo apañas.

Para ir accediendo a todos los caracteres de la cadena, es bastante fácil (supondré que no hay "delayed load", pero sí "delayed jump"):


--- Código: Text ---start:la $s0, Entrance  sig_carac:lw $t0, 0($s0)beq $t0, $zero, fin   # Si es el carácter de final de cadena, ya terminamosnopla procesar,$v0jal $v0               # Si no, llamamos a la función procesar()add $a0,$zero,$t0     # Pasando el primer parámetro a la función procesar()beq $zero,$zero,sig_carac  # Siguiente carácteraddiu $s0,$s0,1            # Apuntamos al siguiente carácterfin:nop procesar:[...]# Volvemos de la funciónjr $ranop PD: todo esto lo escribo ahora de pasada, está sin probar, así que si falla algo, dímelo  :P

manurodri189:
A ver como el código lo has comentado, no he tenido problema en entenderlo, además asi se entiende bastante facil.

He probado el codigo, pero en procesar de momento quiero que me imprima un blanco entre caracteres.

Por ejemplo la entrada es: "aabb"

y quiero que me imprima: "a a b b"

Más que nada para probarlo y entenderlo todo bien.

Este es el codigo que llevamos hasta ahora:


--- Código: ASM ---.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:  in: li $v0,4la $a0,msg1syscall #Almacenar el String en la matriz# Número de syscallori $v0,$zero,8# $a0 = buffer para guardar la cadenala $a0,Entrance# $a1 = tamaño a leerori $a1,$zero,80syscall #Imprimir la matriz# Número de syscallori $v0,$zero,4# $a0 = buffer a imprimirla $a0,Entrancesyscall start:la $s0, Entrance  sig_carac:lw $t0, 0($s0)beq $t0, $zero, fin   # Si es el carácter de final de cadena, ya terminamosnop#la procesar,$v0#jal $v0               # Si no, llamamos a la función procesar()jal procesaradd $a0,$zero,$t0     # Pasando el primer parámetro a la función procesar()beq $zero,$zero,sig_carac  # Siguiente carácteraddiu $s0,$s0,1            # Apuntamos al siguiente carácterfin:nop procesar:  #Número de syscallori $v0,$zero,4syscall li $v0,4la $a0,msg2syscall # Volvemos de la funciónjr $ranop 
Pues bien lo que da a la salida es otra cosa:

aabb      (Esto lo hace bien porque se lo he puesto arriba)
aabb
 (null)

Porque puede ser? Muchas gracias de nuevo.

Salu2

m0skit0:
:no: me parece que no has entendido cómo funcionan las llamadas al sistema con syscall...


--- Código: Text ---procesar: #Número de syscallori $v0,$zero,4syscall li $v0,4la $a0,msg2syscall # Volvemos de la funciónjr $ranop Esto es lo que has puesto en la función procesar. Ten en cuenta que los registros $aX se usan para pasar los parámetros a la función, siendo $a0 el primer parámetro, $a1 el segundo, etc... Pues nuestra función procesar recibe un solo parámetro, en $a0 como hemos dicho, y es el carácter (cuando hacemos add $a0,$zero,$t0 copiamos $t0 en $a0, y $t0 tiene el carácter que estamos procesando). Ahora, al hacer:


--- Código: Text ---ori $v0,$zero,4syscall 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. Ahora la cuestión es ¿cómo imprimir un solo carácter si la única función que tenemos es para imprimir cadenas? No olvides que las cadenas acaban con un carácter nulo...

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa