Título: duda add esp, 4 y crash Publicado por: asmnb en 12 Agosto 2011, 05:02 am hola ando decidio a apreder asm :silbar:, trato de compilar este pequeño programa pero no anda (pero compila), compilado con fasm. agradeceria sus correcciones de las cosas que esten mal . mi duda primero es porque no anda y despues tube que comentar los add esp, 4 que estaban originalmente en el codigo porque no entiendo bine su funcion, si entiendo que suma 4 (un doble palabra) a puntero pila pero no entiendo el objetivo. gracias :-*
Código:
Título: Re: duda add esp, 4 y crash Publicado por: Eternal Idol en 12 Agosto 2011, 10:44 am Para hacerla bien corta tenes que poner los nombres de las funciones importadas entre corchetes:
call [printf] y call [system] Esto se debe a que el nombre por si mismo (printf, sleep, etc.) apunta a la sección de datos de tu programa donde el loader pone despues la direccion de la funcion cuando se carga el ejecutable. Cuando no usas los corchetes estas llamando a esa direccion y ahi no hay codigo sino un puntero a una funcion. Los add los tenes que volver a poner, existen diferentes convenciones de llamada (las mas usadas en Windows son STDCALL y C) y la que usan estas dos funciones al ser de la Run Time de C (MSVCRT= Microsoft Visual C Run Time) es obviamente C. Esta convencion de llamada establece que el llamador es el encargado de sacar lo que puso en la pila (esto permite tener funciones con un numero de parametros variable como printf justamente), en este caso vos pasas un parametro en cada llamada y por eso despues ajustas la pila sumandole el valor de un DWORD. Código
Si hay algo que no entendes lo mejor que podes hacer es descomentar el breakpoint (db 0xCC) y depurar el programa con el WinDbg asi vas a ir viendo por ejemplo que hay en la pila en cada paso (dd @esp). Título: Re: duda add esp, 4 y crash Publicado por: _Enko en 13 Agosto 2011, 14:35 pm Solo un pequeño agregado, si usas funciones de la c runtime, y no quieres estar contando la cantidad de parametros que pushas para luego hacer add esp, X....
fasm te lo puede hacer por vos, win32a.inc incluye la macro ccall y cinvoke. Código: ccall [printf], szStr, szMessage Código: push szMessage saludos. http://www.serviciotecnicocelular.com Título: Re: duda add esp, 4 y crash Publicado por: asmnb en 13 Agosto 2011, 18:31 pm gracias ;-) entendi todo lo que explicaron x zuerte :xD
si tengo mas dudas las voy a decir de nuevo chau Título: Re: duda add esp, 4 y crash Publicado por: asmnb en 13 Agosto 2011, 18:35 pm Código: format PE console mas dudas me surgieron por favor necestio comprender esto Código: push ebp el registro ebp se usa como auxiliar de la pila para dentro de las rutinas es verdad? entonces entiendo que mueva esp a ebp para tener una copia, y despues porque substrae 4 (DWORD) ? :huh: y por otro lado me pregunto, porque guarda la direccion de msg en esp? osea seria como hacer un push msg? pero no me queda claro Código: mov dword [esp],msg aparte no usa add, 4 en la pila luego de llamar :huh: Título: Re: duda add esp, 4 y crash Publicado por: _Enko en 13 Agosto 2011, 21:09 pm Hola, en este caso, en si la linea "push ebp" no es para resguardar el valor de epb, porque en el codigo, el valor de ebp nunca se restaura.
es mas, cambia "push ebp" por "push 0" y veras el mismo resultado. Es mas, aqui el mismo sin las lineas de mas. Código: push 0 despues del printf, no suma 4 a la pila, porque el valor pusheado se sigue utilizando. (mov dword[esp],p) Finalmente, despues de exit, no se suma 4 a la pila porque exit, creo que no es cdecl, es decir, es stdcall y se encarga de liberar la pila. En realidad, de otra forma no podria ser, porque despues de call[exit] ya no se ejecuta mas codigo de tu programa, se termina. Ahora, sobre push ebp/mov ebp, esp/.... Se utiliza para usar variables locales en los procedimientos sin perder el registro de los argumentos que se les pasa. Código: push 1234 Por cierto, de donde sacas esos ejemplos raros? normalmente se haria Código: section '.code' code readable executable Título: Re: duda add esp, 4 y crash Publicado por: asmnb en 14 Agosto 2011, 05:46 am gracias por la explicacion, voy a seguir estudiando esto. si vuelvo a tener dudas ya sabran de mi :laugh:
|