Programación General > ASM (Ensamblador)
Ayuda En Asm ( 2 ) :)
Eternal Idol:
--- Cita de: "y0mism0" ---Al debugearlo, que de esa manera me ayuda, y hasta te dice el orden el que hay que meter los parametros, me devuelve en eax un handle con el valor 00000, que ya es raro.. lugo lei donde me dijiste que lpNumberOfBytesWritten y lpOverlapped no pueden valer los 2 NULL. En fin, el codigo debe ser bastante sencillo xD... Aunque en la pagina que me diste esta todo en ingles, tampoco tengo soltura para el ingles y ademas las funciones apis estan para otros lenguaje, aunque supongo que dara igual...
--- Fin de la cita ---
Si te devuelve 0 es que hubo un error ... ¿Estas creando un programa de consola no? El parametro SUBSYSTEM del enlazador tiene que ser CONSOLE y no WINDOWS. La pagina esta en Ingles como todo, y la ayuda esta mas que nada orientada a C, es lo que hay ... si queres hacerlo en asm tenes que saber los dos lenguajes o pedir a alguien que te ayude. Como decis los dos no pueden valer NULL y ese es el error de tu programa, tenes que pasarle un puntero a una variable de tipo DWORD donde el ponga cuando logro escribir y ademas darle un tamaño del buffer de escritura que sea logico (estas pasandole que escriba 0 bytes ...).
--- Cita de: "y0mism0" ---4.ok, esque ayer lo probe y no me funcionaba, y hoy, misteriosamente si :D
--- Fin de la cita ---
Eso funciona siempre, hay que comprobar mejor.
--- Cita de: "y0mism0" ---Cuando te sale el cuadro ese de tuaplicacion.exe a detectado un problema y debe cerrarse, a que puede deberse? Quiero decir, que cuales son las causas fundamentales?
--- Fin de la cita ---
Una excepcion no controlada.
--- Cita de: "y0mism0" ---PEro lo que no entiendo es, el que ejecuta, para que detecte un problema y se cierre, que secuencia de codigo
--- Fin de la cita ---
Justamente ejecuta el manejador de excepciones por defecto.
y0mism0:
Gracias, y me funciona prefectamente el programa, bueno solo un pequeño detalle...
Que cuando intenta mostrar por la shell la cadena que introduci previamente se come algunas letras :
ej:
escribo: hola, que tal?
me sale:hola, (espacios) tal?
...pero bueno al menos sale algo.. xD...
Respecto al tema de las excepciones. Supongo que el tema ira asi:
El control de excepciones del SO detecta una excepcion en el codigo(stack overflow, se agota la mem,asignacion a una variable un valor no valido...) , y entonces lanza la excepcion e intenta encontrar un manejador de excepciones dentro del ejecutable, que como no lo encuentra, aborta la ejecucion del programa y muestra el cuadro ese de la aplicacion.exe ha detectado un problema, indicandote el offset donde lo encontro. (no si te referias a eso con el manejador por defecto). Esto es lo que yo entiendo, corrijeme si estoy equivocado. Entonces utilice un hex editor, para borrar lo que se me antojara, sin borrar la cabecera, y luego lo abri con el debugger para ver ejemplos de excepcion generados por casualidad ( es bastante facil generar errores xD). El primero que encontre fue en esta linea "OR DWORD PTR DS:[EAX],EBP". Esto por lo visto es un error. Lo que me gustaria que me dijeras, son ejemplo de errores, y explicarlos brevemente, como este, para no cometerlos yo al programar.
Otra cosilla, que me viene a la cabeza, jejej, como es posible desbordar el buffer asignado a una variable? EJ: pongo en la zona de .data algo asi : dd 2, y por muy larga que sea la cadena de caracteres que meto, no me salta el cuadrito de la excepcion. POr cierto, que significa declarar datos asi : dd 0h, porque se pone el 0h? es el tamaño del buffer? (no creo....)
Y la ultima cosa, (perdona por tantas preguntas xD,..) cuando un programa se carga en memoria, cada vez se carga a partir de un offset, que le asigna el SO vd? no siempre en el mismo... Entonces si por ej, te salta un cuadro de excepcion, indicandote el offset donde esta el error, si tu lo abres con un debugger, no tiene porque estar en el mismo offset, o si? Y cuando lo abres con un hex editor?
Saludos!
Eternal Idol:
--- Cita de: "y0mism0" ---Gracias, y me funciona prefectamente el programa, bueno solo un pequeño detalle...
Que cuando intenta mostrar por la shell la cadena que introduci previamente se come algunas letras :
ej:
escribo: hola, que tal?
me sale:hola, (espacios) tal?
...pero bueno al menos sale algo.. xD...
--- Fin de la cita ---
No se, pone el codigo del programa ... habra algo mal.
--- Cita de: "y0mism0" ---Respecto al tema de las excepciones. Supongo que el tema ira asi:
El control de excepciones del SO detecta una excepcion en el codigo(stack overflow, se agota la mem,asignacion a una variable un valor no valido...) , y entonces lanza la excepcion e intenta encontrar un manejador de excepciones dentro del ejecutable, que como no lo encuentra, aborta la ejecucion del programa y muestra el cuadro ese de la aplicacion.exe ha detectado un problema, indicandote el offset donde lo encontro. (no si te referias a eso con el manejador por defecto). Esto es lo que yo entiendo, corrijeme si estoy equivocado. Entonces utilice un hex editor, para borrar lo que se me antojara, sin borrar la cabecera, y luego lo abri con el debugger para ver ejemplos de excepcion generados por casualidad ( es bastante facil generar errores xD). El primero que encontre fue en esta linea "OR DWORD PTR DS:[EAX],EBP". Esto por lo visto es un error. Lo que me gustaria que me dijeras, son ejemplo de errores, y explicarlos brevemente, como este, para no cometerlos yo al programar.
--- Fin de la cita ---
Si, baicamente funciona de esa manera. EAX en ese punto debe ser una direccion invalida. Si queres mas informacion busca SEH, yo puedo ayudarte con problemas pero no soy profesor.
--- Cita de: "y0mism0" ---Otra cosilla, que me viene a la cabeza, jejej, como es posible desbordar el buffer asignado a una variable? EJ: pongo en la zona de .data algo asi : dd 2, y por muy larga que sea la cadena de caracteres que meto, no me salta el cuadrito de la excepcion. POr cierto, que significa declarar datos asi : dd 0h, porque se pone el 0h? es el tamaño del buffer? (no creo....)
--- Fin de la cita ---
Esos numeros inicializan la variable a 0. Un overflow no tiene siempre que generar una excepcion ... depende que escribas y donde ...
--- Cita de: "y0mism0" ---Y la ultima cosa, (perdona por tantas preguntas xD,..) cuando un programa se carga en memoria, cada vez se carga a partir de un offset, que le asigna el SO vd? no siempre en el mismo... Entonces si por ej, te salta un cuadro de excepcion, indicandote el offset donde esta el error, si tu lo abres con un debugger, no tiene porque estar en el mismo offset, o si? Y cuando lo abres con un hex editor?
--- Fin de la cita ---
No, los ejecutables suelen tener una direccion de carga unica que es repestada por el loader de Windows, proba a ponerle la direccion base de Kernel32 o NTDLL y vas a ver lo que pasa ...
y0mism0:
--- Código: Text --- .386.model flat,stdcalloption casemap:noneinclude \masm32\include\windows.incinclude \masm32\include\kernel32.incincludelib \masm32\lib\kernel32.libinclude \masm32\include\user32.incincludelib \masm32\lib\user32.lib .dataMsgBoxCaption db "msgboX",0MsgBoxText db "¿hola, que tal?",0cadena db "hola, xD",0cadena2 dd 20hlpdword db 0hlpdword2 db 0hhInstance dd 0hhInstance2 dd 0h .codestart:push MB_OKpush OFFSET MsgBoxCaptionpush OFFSET MsgBoxTextpush NULLcall MessageBox push STD_INPUT_HANDLEcall GetStdHandlemov hInstance2,eax push NULLpush OFFSET lpdword2push 20hpush OFFset cadena2push hInstance2call ReadFile push STD_OUTPUT_HANDLEcall GetStdHandlemov hInstance,eax push NULLpush OFFSET lpdwordpush 20hpush OFFset cadena2push hInstancecall WriteFile call ExitProcessend start
POngo el codigo por si ves algo mal. cadena2 "dd 20h", no es necesario, vd?
--- Citar ---No, los ejecutables suelen tener una direccion de carga unica que es repestada por el loader de Windows, proba a ponerle la direccion base de Kernel32 o NTDLL y vas a ver lo que pasa ...
--- Fin de la cita ---
Y el que se carguen 2 programas a la vez, y no se pisen al cargarse en la misma direccion (0040100), es por el tema de la memoria virtual, vd?
Eternal Idol:
--- Cita de: "y0mism0" ---POngo el codigo por si ves algo mal. cadena2 "dd 20h", no es necesario, vd?
--- Fin de la cita ---
cadena2 dd 20h<< Eso te lo inventaste ... con eso declaras una variable de tipo DWORD (4 bytes) cuyo valor al inicio es 0x20.
Para hacer un array de 20 bytes inicializados a 0 tenes que poner esto:
cadena2 db 20 dup(0)
Por otro lado le estas pasando un valor fijo al WriteFile, entonces escribira ese tamaño ... pese a que tu cadena sea menor ... pasale aunque sea un byte menos de tamaño asi la cadena termina en cero y no lo que haya justo despues ...
--- Cita de: "y0mism0" ---Y el que se carguen 2 programas a la vez, y no se pisen al cargarse en la misma direccion (0040100), es por el tema de la memoria virtual, vd?
--- Fin de la cita ---
Cada proceso tiene su propio espacio de direccion totalmente independiente de los demas.
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa