Programación General > ASM (Ensamblador)

 Ayuda En Asm ( 2 ) :)

(1/4) > >>

y0mism0:
Bueno, hice lo q me dijiste Eternal Idol, y me baje el Masm32, y me lei un manual, pero tengo algunas dudas.

1.
Este codigo tan secillo me compila bien, pero sin embargo me da un error en timepo de ejecucion, la tipica ventanita de windows diciendo q aplicacion.exe a detectado un problema y debe cerrarse...

--- Código: Text --- .386.model flat,stdcalloption casemap:none .data.codestart:mov eax,04447hend start    A q se puede deber?

2.

Mira este code, funciona sin problema pero me gustaria interpretarlo al depurarlo (utilizo ollydbg).

--- 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?",0 .codestart:invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OKinvoke ExitProcess, NULLend start  
Esto es lo que me sale debugeando



Podrian explicarme lo que significa cada linea del debugeo para ver como trabaja un debug? A ver, las instrucciones mov, call etc, estiendo para que sirven , pero no como debugea el codigo el debugger. POr ej no entiendo para k pone push 0, o push 1.0040... ( no entiendo que es el putno ni los parametros), call <jmp..., y los dos Jmp del final, que no entiendo a que vienen...

3. Que funcion del SO tengo q utilizar para imprimir una cadema de caracteres por la linea de comandos, como si fuera el system("cadena"); del lenguaje C?

4. Y que funcion para almacenar una cadena de caracteres q escriba por el teclado?

Saludos.

Eternal Idol:

--- Cita de: "y0mism0" ---1.Este codigo tan secillo me compila bien, pero sin embargo me da un error en timepo de ejecucion, la tipica ventanita de windows diciendo q aplicacion.exe a detectado un problema y debe cerrarse...

A q se puede deber?
--- Fin de la cita ---

No devolves el control al sistema de ninguna manera, el codigo que se ejecute despues de tu instruccion mov es indeterminado; si agregas un ret o como en el otro codigo un ExitProcess funcionara perfectamente.


--- Cita de: "y0mism0" ---2.Mira este code, funciona sin problema pero me gustaria interpretarlo al depurarlo (utilizo ollydbg).
--- Fin de la cita ---

invoke es una directiva que sirve para que MASM se encargue por si solo de emitir el codigo necesario para una llamada de tipo stdcall. Este tipo de convencion de llamada hace el pasaje de parametros en la pila y el llamador es el encargado de limpiarla. Por lo tanto lo que ves son push's por cada uno de los parametros y un call. En cuanto a esos numeros son direcciones en hexadecimal de las cadenas de caracteres (supongo que tu ejecutable se llama 1 ...). Los saltos esos son un poco mas dificiles de explicar pero digamos que debido a las DLLs que usa Windows no necesitas direcciones fijas y eso se llena en tiempo de ejecucion. Si queres podes investigar mas sobre el formato PE para saber como funciona pero no te lo recomiendo todavia ...



--- Cita de: "y0mism0" ---3. Que funcion del SO tengo q utilizar para imprimir una cadema de caracteres por la linea de comandos, como si fuera el system("cadena"); del lenguaje C?
--- Fin de la cita ---

system no imprime una cadena sino que intenta ejecutarla; printf si imprime una cadena y podes usar entre otras, como creo haberte dicho en el anterior hilo, WriteFile y GetStdHandle.


--- Cita de: "y0mism0" ---4. Y que funcion para almacenar una cadena de caracteres q escriba por el teclado?
--- Fin de la cita ---

ReadFile entre otras.

y0mism0:
3. ok, jeje, me equivoque, nose porque puse system, queria poner printf como tu dices.
Intente utilizar WriteFile y GetStdHandle, pongo el code( esta vez utilizo call, jeje):

--- Código: Text --- .....data....cadena      db &#34;hola, xD&#34;,0..........push NULLcall GetStdHandle push OFFset cadenapush eaxcall WriteFile......  Y me da un error en tiempo de ejecucion (ya puse el ret :P). MI pregunta es, como debo  poner el codigo para que me funcione? Y para que hay que hacer un push NULL en muchas ocasiones antes de llamar a la funcion? Esque lo vi en muchos codigos en internet y nose el porque hay que pornerlo..

Y el de ReadFile?No sabes de algun sitio donde te diga los parametros que hay que meterles a las funciones y como hay que utilizarlas?

4. Otra cosa, como se ponen las etiquetas y sus referencias en masm para 32 bits?
Esque cuando programaba para win16, bastaba con poner las etiquetas asi:
:etiqueta, y te referias a ella con su nombre, jmp etiqueta... como se hace ahora?

Y otra pregunta, que significa el "NOP" que pone muchas veces cuando debugeas un codigo??

Saludos.

Eternal Idol:

--- Cita de: "y0mism0" ---Y me da un error en tiempo de ejecucion (ya puse el ret :P). MI pregunta es, como debo  poner el codigo para que me funcione? Y para que hay que hacer un push NULL en muchas ocasiones antes de llamar a la funcion? Esque lo vi en muchos codigos en internet y nose el porque hay que pornerlo..

Y el de ReadFile?No sabes de algun sitio donde te diga los parametros que hay que meterles a las funciones y como hay que utilizarlas?
--- Fin de la cita ---

La respuesta es simple: correctamente. ¿Porque hay un push NULL? Bueno, NULL es en realidad 0, se le estara pasando 0 como primer parametro a esas funciones, asi de simple tambien.

Estas usando mal tanto GetStdHandle como WriteFile, al igual que ReadFile podes encontrar como usarlas en http://msdn.microsoft.com


--- Cita de: "y0mism0" ---4. Otra cosa, como se ponen las etiquetas y sus referencias en masm para 32 bits?
Esque cuando programaba para win16, bastaba con poner las etiquetas asi:
:etiqueta, y te referias a ella con su nombre, jmp etiqueta... como se hace ahora?
--- Fin de la cita ---

Yo creo que siempre se hizo con etiqueta: asi que probalo asi jeje.


--- Cita de: "y0mism0" ---Y otra pregunta, que significa el "NOP" que pone muchas veces cuando debugeas un codigo??
--- Fin de la cita ---

Nop es no-operation, basicamente no hace nada.

y0mism0:

--- Cita de: "Eternal Idol" ---La respuesta es simple: correctamente.
--- Fin de la cita ---
 :huh:
Me sigue dando error:

--- Código: Text --- push STD_OUTPUT_HANDLEcall GetStdHandlemov hInstance,eax  push NULLpush NULLpush 0push OFFset cadenapush hInstancecall WriteFile  
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...

4.ok, esque ayer lo probe y no me funcionaba, y hoy, misteriosamente si :D

BUeno, y ya, te pregunto otra cosa a ver si me vas despejando las dudillas que tengo, jejej..
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? Por ej, una de ellas, seria el stack overflow, declarar una variable de un tamaño y meterle un tamaño mayor, entonces se borra el valor de retorno de la funcion, y se sigue ejecutando codigo, y entonces te saldria el cuadrito ese. PEro lo que no entiendo es, el que ejecuta, para que detecte un problema y se cierre, que secuencia de codigo, por ej. Es igual que cuando no ponia el ret al final de programa para devolverle el control al SO, que seguia ejecutando codigo y provocaba un error.

Saludos.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa