Ayuda con funcion "Split"

Iniciado por Vaagish, 26 Marzo 2013, 23:09 PM

0 Miembros y 2 Visitantes están viendo este tema.

Vaagish

Buenas amigos del foro.. Espero que anden bien.. :)

Bueno, creo que hoy la duda esta clarisima,, preciso dividir un string con un criterio dado,, asi, tal cual lo haria vb con split.

Si a alguien se le ocurre algo, una idea por donde empezar, o mejor aun un pseudocodigo, o lo que sea jaja

Desde ya, muchas gracias! :)

Flamer

hola Vaagish los string en asm se manejan en posiciones de memoria no puedes manejarlos como el vb ejemplo:

Nota: los comandos y el code pueden estar mal llaque no estoy en la pc

si tienes la palabra "hola mundo hacking" en la posicion 00401000 y la quieres dividir seria.


.data?
parte1 db ?
parte2 db ?
parte3 db ?
.code
xor eax,eax
xor ebx,ebx
.while ebx <= 4
   mov eax, bytes ds prt[00401000+ebx]
   mov parte1,eax
   inc ebx
.endwhile
xor eax,eax
xor ebx,ebx
.while ebx <= 5
   mov eax, bytes ds prt[00401005+ebx]
   mov parte2,eax
   inc ebx
.endwhile
xor eax,eax
xor ebx,ebx
.while ebx <= 7
   mov eax, bytes ds prt[0040100C+ebx]
   mov parte3,eax
   inc ebx
.endwhile

lo que ase este code es guardar la palabra "hola" en la variable parte1 y la palabra "mundo" en parte2 y "hacking" en parte3

saludos flamer y para unir es a la biseversa

Vaagish

#2
Gracias Flamer por la respuesta, me es de gran ayuda para empezar, es que aun soy muy noob en esto de ASM.
El unico detalle es que mi code no tiene una cadena predefinida, y yo preciso cortar la cadena con un delimitador dado..
Seguro sabras de que hablo.. mi cadena llega algo asi, por ejemplo: "Mnsj|Ola keace", yo preciso :

Parte1 = "Mnsj"
Parte2 = "Ola keace"

A lo mejor, con darme una idea como "retocar" ese code y yo me manejo.. si no puedo preguntare otra vez jejeje

Gracias!!  


EI: juntando mensajes.


Y ya que estoy en el hilo, me tomo el atrevimiento de hacer una consulta bien, pero bien noob..
El operador xor, por lo que entiendo:

Devuelve True si                                         
a = true y b = false                                   
a = false y b = true   

Y False si:
a = true y b = true
a = false y b = false

pero.. para que sirve en este caso por ejemplo?

EDITADO: Ta, ya entendi para que sirve xor :)

Flamer

el xor por si lo entendistes mal o de otra forma te lo explico yo lo uso para dejar los registros en cero y el codigo que te puse arriba es para separar las palabras guardandolas en las variables parte1, 2, 3.

y por otro lado te deje el ejemplo para que te guies por ti mismo no puedo aserte todo el codigo y si tienes dudas aqui te dejo un link donde encontraras varios tutoriales te recomiendo el de radasm

ricardonarvaja.info/WEB/OTROS/PROGRAMACION/TEORIAS%20SOBRE%20PROGRAMACION%20EN%20ASSEMBLER/


saludos flamer y si te atoras pregunta

Vaagish

Excelente recopilacion de tutos! Hoy de tarde los veo con tiempo!
Si, estoy usando el RadASM,, es muy bueno.. y por ahi vi en ese enlace que me mandaste que hay unos tutos de RadASM, me viene impeca para ampliarme mas en ese IDE...
Con respecto al code creo que voy a poder adaptarlo.. ;)

Gracias sabio! Abrazo!

Y larga vida al rey ASM ! Jejeje

cpu2

Hola

Esto puede ayudarte.

Código (asm) [Seleccionar]
.section .data

cadena:
.ascii "dddabbb"

.section .text
.globl _start

_start:

push cadena

_C.0:

incq %rsp
cmpb $0x61, (%rsp)
jne _C.0

incq %rsp
movl (%rsp), %edi
incb %al
syscall


Si quieres que copie las "d", elimina el inc de la línea 19 y el mov dejalo así

Código (asm) [Seleccionar]
movl -0x4(%rsp), %edi

Es un ejemplo que hice, se puede mejorar mucho más.

Un saludo.

Vaagish

Hola gentes!
La verdad queria hacerlo solo, pero esto me esta rompiendo la cabeza..

Tengo un problema con esta instruccion: mov eax, dword ptr [Cadena + ebx]

Veamos,, esto deberia poner la direccion de memoria de mi cadena en el registro eax, no ??

Pero si hago esto:

mov OtraVar, eax
messagebox OtraVar

Me muestra los 4 primeros caracteres de mi Cadena..
No estoy utilizando while, ni nada.. quedaria asi:

   xor eax, eax
   xor ebx, ebx
   
   mov eax, dword ptr [Cadena + ebx]
   mov Texto, eax
   invoke MessageBox, NULL, addr Texto, addr Titulo, MB_OK

Resultado "Esta" -> 4 primeros caracteres de mi Cadena

Como deberia recorrer el string caracter por caracter ? Yo me encargo del cmp, del jmp y todo lo demas :D

Graciass !! Y Gracias cpu2 tambien pero eso es fasm, no? apenas puedo con masm aun jejeje

MCKSys Argentina

Si tienes un buffer (Cadena), puedes usar la palabra offset para hacer referencia a la posicion donde esta.

mov eax, offset Cadena

Hace que eax apunte al primer byte de la cadena.

Ahora

mov eax, dword ptr [Cadena]

Hace que eax contenga "el dword que esta apuntado por" Cadena, osea los 4 primeros bytes de la misma.

Para recorrer el stringz char x char hay muchos metodos. Lo que hice YO al principio, fue hacer un programa que usaba las macros de masm (fijate el folder doc de la instalacion de masm), use StrCopy (no recuerdo bien cual fue con certeza), compile y miré el asm con Olly.
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Flamer

hola aqui un codigo aver si te funciona ya que no estoy en la pc pero llegando a casa si esta mal lo soluciono.
El codigo debe de imprimir un msgbox en pantalla de cada letra dime si te funciona

.data
Titulo db "Mensage hola",0
Cadena db "hola mundo hacking",0
.code
   xor eax, eax
   xor ebx, ebx
   .while ebx <= 18
   mov eax, bytes ds ptr [Cadena + ebx]
   invoke MessageBox, NULL, addr eax,
addr Titulo, MB_OK
   inc ebx
   .endwhile


saludos flamer y cualquier duda pregunta

Vaagish

#9
Gracias por las respuestas a todos!!

No me funco eso Flamer, me dice un error que ya me habia salido, en tantas pruebas que he echo.. me dice:

missing operator in expression -> mov eax, byte ds ptr [Cadena + ebx]

miren como va la cosa, asi me pueden decir si voy bien :)

.code

Inicio:

   xor eax, eax
   xor ebx, ebx
   mov eax, offset[Cadena]
   
.while ebx < 4
   
   mov eax, byte ptr [eax+1]  -> Se que aca deberia sumar ebx, pero no funca
   cmp eax, '|'
   je Corta
   mov Texto, eax
   inc ebx   
   
.endw

Corta:
   invoke dwtoa, eax, addr Texto
   invoke MessageBox, NULL, addr Texto, addr Titulo, MB_OK
   invoke ExitProcess, 0

end Inicio

Si pongo como decis tu Flamer me dice missing op. y si pongo +1 me dice invalid instruction.. Me quiere enfermar jajaja

Bueno, por otro lado tambien precisaria que el while se ejecute hasta el tamaño del string,, no solo hasta 4 :/

Pd: Gracias MCKSys tambien por el aporte, ya comprendi el tema dword y el byte ;)