Ayuda con funcion "Split"

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

0 Miembros y 1 Visitante están viendo este tema.

Flamer

como te dije dame tiempo de llegar a mi casa y te lo pongo bien

saludos flamer y dame tiempo

cpu2

Cita de: Vaagish en 27 Marzo 2013, 22:09 PM
Hola gentes!
Como deberia recorrer el string caracter por caracter ? Yo me encargo del cmp, del jmp y todo lo demas :D

A ver si lo entiendo porque la verdad esto se esta desviando, quieres mover carácter por carácter a eax no?

Para luego imprimir cada carácter con la api messagebox?

Sguiendo el código anterior hice esto aver si te puede ayudar

Código (asm) [Seleccionar]
_C.0

lodsb
cmpb $0x7c, (%rsi)
jne _C.0


Copia byte por byte a al "eax de 8 bit", hasta que se encuentre con "|" es eso lo que quieres?

Cita de: Vaagish en 27 Marzo 2013, 22:09 PM
Y Gracias cpu2 tambien pero eso es fasm, no? apenas puedo con masm aun jejeje

De nada, se trata de la sintaxis de AT&T, los ejemplos son de 64 bits solo los tienes que traducir a nasm y 32 bits.

Un saludo.

Vaagish

En realidad yo preciso una funcion que sea Split, sin mas.. yo le paso un string como parametro a la funcion y ella se encarga de Splitearla.. El tema de los mensajes de windows son solo para mostrar en pantalla como me queda la cadena X)

Luego veo el tema de la traduccion AT&T.. Si ya me complica masm.. imaginate que entiendo yo de eso jaja

Saludos !

MCKSys Argentina

Veo que no tienes en cuenta algunas cosas. Examinemos el problema:

Quieres hacer en MASM lo mismo que en VB6: usar la función split.

La función split toma un string de largo arbitrario (por sencillez diremos que es un string terminado en zero) y otro string, el cual NORMALMENTE es de largo 1 (por sencillez lo tomaremos como de largo 1).

Lo que hace la función es partir el primer string en la posición de cada ocurrencia del segundo string. Cabe destacar que el string de separación (el segundo string) no se incluye en el resultado.

Luego, las strings obtenidas se colocan en un array (matriz en vb) de strings.

Faltan analizar los casos especiales, como por ej.: si no se encuentra el 2º string, pero por ahora basta con lo dicho.

Ahora, para lo anterior, debes tener en cuenta lo siguiente:

El array de cadenas: lo devuelves como puntero? Osea, la función se encarga de allocar la memoria, llenarla (partir la cadena) y devolver un ptr al array en eax? O mejor lo pides como parámetro? Si viene como parámetro: cuál debería ser el tamaño? Un array de strings en realidad sería un array de punteros, donde deberás especificar el tamaño, con lo que ya tendrías una estructura.

Como ves, no es tan sencillo como suena, pero tampoco imposible. Te aconsejo mirar la carpeta HELP del MASM. En especial el archivo masmlib. Verás que la lib de MASM tiene muchas cosas que puedes usar y que te permitirán implementar esta función de una forma sencilla. Ejemplos que te podrían servir en este caso:

create_array  Create an array of pointers to a user defined array
InString Find substring in zero terminated source string
szWcnt  Count the occurrence of text in a zero terminated string

y la lista sigue y sigue... :)

Saludos!
MCKSys Argentina

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


Vaagish

#14
Huu,, y yo de novato mandandome estas ocurrencias... Igual, creo que no seria para tanto MCK, te puedo decir MCK no ? jaja
Bueno, a lo que voy..
CitarLo que hace la función es partir el primer string en la posición de cada ocurrencia del segundo string.
No entiendo esa parte.. Lo que hace la funcion es partir una cadena, cuando encuentra un delimitador.. en este caso el caracter " | ". Asi mismo yo se que mi cadena solo se va a dividir en 2, y si en el futuro agrandase la funcion, bueno.. despues veo..

Voy a ser claro para que no de a confusion ;)

La cadena que preciso cortar puede ser por ejemplo: "CONNECT|Username" y comandos de ese tipo,,, supongo ya habran visto este tipo de cadenas en 1 millon de sources y se sobre entiende para que sirve.. ;)

Pd: voy a mirar eso que me dijiste y el enlace que hay por ahi arriba

Flamer

Hola ya quedo el codigo

.data
Mensaje db "Hola mundo",0
Titulo db "Resultado",0
.data?
Caracter db ?
.code
xor eax,eax
xor ebx,ebx
.while ebx<=10
   mov al,byte ptr ds:[Mensaje+ebx]
   mov Caracter,al
   invoke messagebox,null,addr Caracter,addr Titulo,MB_OK
   inc ebx
.endw


dime si te salta error ami mesale bien

saludos flamer y dime como te fue

cpu2

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

cadena:
.ascii "cc|aa"

.section .text
.globl _start

_start:

movq $cadena, %rbx

_C.0:

incb %bl
cmpb $0x7c, (%rbx)
jne _C.0

movw -0x2(%rbx), %di
incb %bl
movw (%rbx), %si


Cuando encontrara  "|" copiaría los carácteres "cc" a di, y "aa" a si.

Más o menos es eso lo que pretendes no?

Un saludo.

mr.blood

Por si te sirve lo hice en C. Si te da una idea o si quieres usarla en tu codigo de ASM.

http://foro.elhacker.net/programacion_cc/c_funcion_split-t386651.0.html

Sa1uDoS

Vaagish

Excelente amigos! Gracias por las respuestas a todos!! Yo pase 16 hs en querer resolverlo,, ya me tenia mal jaja

Es exactamente eso lo que preciso cpu2 pero adaptado al code de flamer que funciona impeca.. asi que ahora me toca a mi unirlos jeje Gracias! Mr.blood, tambien me sirve de guia.. aca todo sirve, no hay desperdicios ;)

Gracias a todos! Ya volvere con alguna pregunta de novato jeje


Binary_Death

Hacer una función split en la que el delimitador sea un carácter, sólo un carácter, es muy fácil. Tienes que recorrer la cadena byte a byte y comparar (hay instrucciones precisas en ASM que usan los registros  ESI y EDI, muy útiles para estos casos).

Yo seguiría este procedimiento:

Reserva memoria para un array de punteros. Almacena la dirección inicial de la cadena a splitear en el primer elemento del array.
Ahora vamos recorriendo la cadena y buscamos la primera ocurrencia del delimitador. En cuanto la encontremos, sustituimos el byte por un byte nulo (0x00) y aumentamos el contador para pasar al siguiente carácter, cuya dirección almacenamos en el siguiente elemento de nuestro array de punteros.
Seguimos esto en bucle hasta encontrarnos con el final de la cadena.

Hecho esto, tendremos un bonito array de punteros cada uno apuntando a un trozo de la cadena, o mejor dicho, tendremos muchas cadenas almacenadas consecutivamente en memoria. Perfecto.

Ahora, si quieres hacer un split como el de VB (delimitador de más de un carácter), la cosa se complica. Lo difícil en ese caso es el algoritmo a usar, y hay que pensarlo bien para que sea óptimo.