Título: Cadenas en FASM Publicado por: Yuki en 1 Mayo 2016, 18:37 pm Hola, estoy desarrollando un compilador en Basic 6.0 y hasta ahora he logrado superar muchos obstaculos (procesamiento y traducción de ecuaciones matematicas + funciones a ensamblador, adición de APIS y otras cosas) pero tengo un problema con las cadenas.
Para que se hagan una idea con lo que estoy tratando les doy el siguiente código de ejemplo de mi compilador. Código: API MessageBox(Opcional hWnd:Entero,Texto:Cadena = "Hola soy una cadenita",Título:Cadena = "Soy un sexual título",Opcional Bandera:Entero = 48):Entero, "User32.dll" "MessageBoxA" El problema esta al tratar de rellenar la variable "Cadenita" con "Soy una vulgar cadena". Ya que al visualizar el MessageBox amarece "Soy un0" como texto. El código ensamblador generado es el siguiente. Código: ; Código generado en Fractor! Como se puede notar, para asignarle a Cadenita el texto "Soy una vulgar cadena" utilizo strcat ya que yo asumí que strcat copia el segundo parametro en el primero, ¿que estoy haciendo mal? Título: Re: Cadenas en FASM Publicado por: fary en 1 Mayo 2016, 19:28 pm Tienes que crear un buffer con malloc, LocalAlloc o similar y ahí concatenar las cadenas.
Saludos. Título: Re: Cadenas en FASM Publicado por: Yuki en 1 Mayo 2016, 20:16 pm ¿Me podrias dar un pequeño ejemplo? no puedo visualizar el código sin usar registros.
Código: .datos Disculpen por el doble comentario, solucione mi problema con un procedimiento propio que hice, lo pongo acá por si alguien tiene el mismo problema que yo y requiere una solución, ademas no me gusta dejar mis posts sin el "resuelto". Utilizo el siguiente procedimiento en mi compilador para concatenar cadenas. Acepta 2 parametros (punteros a cadenas) y retorna un puntero a la cadena concatenada en EAX. Código: proc concatenar uses ecx,Fuente2,Fuente1 ; Retorna en EAX Me hubiera gustado que fuera mas chica, pero como esta escrita en ensamblador supongo que de todas maneras debe ser muy rapida. Título: Re: Cadenas en FASM Publicado por: fary en 6 Mayo 2016, 10:28 am Hola Yuki,
Es combeniente que el buffer sea de tamaño len(Fuente2) + len(Fuente1) + 1 para el byte nulo de final de cadena. Usa mejor invoke para llamar a las API, queda un código mas corto y mas limpio y viene a ser lo mismo... para las funciones de las librerias de C usa cinvoke, que te arregla la pila. Código
Ademas el buffer que crees con malloc limpialo con ZeroMemory o similares para que no contenga caracteres extraños, llegado el momento puedes tener lios con eso. saludos y suerte con tu proyecto. |