Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: ivancea96 en 12 Agosto 2014, 17:06 pm



Título: Sobre paso de parámetros y retorno de funciones
Publicado por: ivancea96 en 12 Agosto 2014, 17:06 pm
Hola :D

¿Qué veis mejor? ¿Pasar parámetros a funciones en la pila, o en registros?

Yo veo más sencillo pasar parámetros con un registro, así asegurarse de que la pila no cambia. Pero no se que es lo más "normal".

Por ejemplo, ¿al pasar parámetros a funciones con la pila, esas funciones van a leer la pila y dejarla como está, o van a quitar los valores de la pila?

Algunas dudillas que me quedaron al programar ASM xD


Título: Re: Sobre paso de parámetros y retorno de funciones
Publicado por: Eternal Idol en 12 Agosto 2014, 17:30 pm
Para depurar la pila sin duda, cuando se usan registros cada funcion los va sobreescribiendo y analizar un dump es doloroso.

Lo normal hoy en dia es usar registros, es la convencion de llamada stdcall en x64 y (el Kernel) Linux tambien usa registros. Igual son limitados, al final terminas usando la pila ...

Eso depende de la convencion de llamada, la de C limpia la pila el llamador despues de llamar, en stdcall el llamado pero eso se hace justo al retornar con retn (no es que se quiten los valores, simplemente se ajusta el puntero ESP). Ambas casos los podes analizar creando un sencillo programa en C que llame a la API de Windows y a printf por ejemplo.


Título: Re: Sobre paso de parámetros y retorno de funciones
Publicado por: xv0 en 12 Agosto 2014, 17:33 pm
Citar
¿Qué veis mejor? ¿Pasar parámetros a funciones en la pila, o en registros?

Veo mejor usar registros, a eso se le llama sistema "fastcall". El motivo ya lo dice el nombre, trabajar con los registros es mejor que con la pila.

Citar
Por ejemplo, ¿al pasar parámetros a funciones con la pila, esas funciones van a leer la pila y dejarla como está, o van a quitar los valores de la pila?

Si haces un disassembler veras que cargan directamente los valores en la pila, luego la funcion llamada los lee, normalmente suelen limpiarla o dejarla como antes, pero pierdes optimizacion, por eso es mejor usar registros, desde este punto de vista.

Un saludo.


Título: Re: Sobre paso de parámetros y retorno de funciones
Publicado por: daryo en 12 Agosto 2014, 17:36 pm
preguntas por curiosidad o por un caso en especifico?

Citar
¿Qué veis mejor? ¿Pasar parámetros a funciones en la pila, o en registros?
pues como todo depende pero por ejemplo la api de windows usa la pila si vas a hacer un messagebox harias:

Código
  1. push ultimoparametro
  2. push penultimo
  3. push mensaje
  4. push primero
  5. call messagebox
  6.  
Citar
¿al pasar parámetros a funciones con la pila, esas funciones van a leer la pila y dejarla como está, o van a quitar los valores de la pila?

cuando lees un valor de la pila  con
Código
  1. pop
lo estas sacando. imagina la pila como poner objetos uno encima de otro el primero que sacas es el ultimo que pusiste




Título: Re: Sobre paso de parámetros y retorno de funciones
Publicado por: Eternal Idol en 12 Agosto 2014, 17:39 pm
En x86 stdcall usa sola la pila pero en x64 se usan primero los registros.

http://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention


Título: Re: Sobre paso de parámetros y retorno de funciones
Publicado por: ivancea96 en 12 Agosto 2014, 19:21 pm
cuando lees un valor de la pila  con
Código
  1. pop
lo estas sacando. imagina la pila como poner objetos uno encima de otro el primero que sacas es el ultimo que pusiste

Recuerda que también se puede leer la pila sin POP.

Gracias por las respuestas :D Estaba yo haciendome una librería, y no sabía si dejar el tema de llamadas con registros, o cambiarlo a la pila. Pero la verdad, los registros me parecen más sencillos jaja


Título: Re: Sobre paso de parámetros y retorno de funciones
Publicado por: Eternal Idol en 12 Agosto 2014, 19:34 pm
Gracias por las respuestas :D Estaba yo haciendome una librería, y no sabía si dejar el tema de llamadas con registros, o cambiarlo a la pila. Pero la verdad, los registros me parecen más sencillos jaja

Si, pero ojo que los registros son finitos y si las funciones tienen muchos parametros tenes que recurrir a la pila igual; sino usa punteros a estructuras para pasar los parametros ... que normalmente terminan siendo variables locales en la pila tambien  ;D