elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  ¿Cómo funciona la pila con respecto a las funciones?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Cómo funciona la pila con respecto a las funciones?  (Leído 4,587 veces)
GGZ

Desconectado Desconectado

Mensajes: 144



Ver Perfil
¿Cómo funciona la pila con respecto a las funciones?
« en: 28 Octubre 2016, 09:12 am »

La consiga:
Código:
En el programa que sigue, funcs implementa void (*funcs[])()={f1, f2, f3}. Compl´etelo para que
la l´ınea con el comentario corresponda a funcs[entero](). Use el c´odigo m´as eficiente.

Código
  1. .data
  2. fmt:
  3.   .string "%d"
  4. entero:
  5.   .long 020
  6. funcs:
  7.   .quad f1
  8.   .quad f2
  9.   .quad f3
  10.  
  11.  
  12. .text
  13.  
  14. f1:
  15.   movl $0,%esi
  16.   movq $fmt, %rdi
  17.   call printf
  18.   jmp fin
  19.  
  20. f2:
  21.   movl $1,%esi
  22.   movq $fmt, %rdi
  23.   call printf
  24.   jmp fin
  25.  
  26. f3:
  27.   movl $2,%esi
  28.   movq $fmt, %rdi
  29.   call printf
  30.   jmp fin
  31.  
  32. .global main
  33. main:
  34.   pushq %rbp
  35.   movq %rsp,%rbp
  36.  
  37. # Leemos el entero
  38.   movq $entero, %rsi
  39.   movq $fmt, %rdi
  40.   xorq %rax,%rax
  41.   call scanf
  42.   xorq %rax,%rax
  43.  
  44.   movl entero, %ecx
  45.   movq funcs(, %rcx, 8), %rdx  
  46.  
  47.   jmp *%rdx
  48.  
  49. fin:
  50.   movq %rbp, %rsp
  51.   popq %rbp
  52.   ret
  53.  

Pero realmente no entiendo bien para que sirven estas dos intrucciones:
  pushq %rbp
   movq %rsp,%rbp


Yo sé que la traducción de eso en C es algo como *(rsp) = rbp; y rbp = rsp

Pero no entiendo para nada, ¿para qué se usa eso? Leí todo el apunte y apenas lo entendí.
No entiendo bien que tiene que ver las funciones con la pila.
Si alguien me da algún ejemplo en C sería mucho mejor, porque entiendo perfecto C.


En línea

LET'S DO STUFF!!
fary


Desconectado Desconectado

Mensajes: 1.061



Ver Perfil WWW
Re: ¿Cómo funciona la pila con respecto a las funciones?
« Respuesta #1 en: 28 Octubre 2016, 14:27 pm »

Las funciones están directamente relacionadas con la pila. Los parametros se le pasan a las funciones introduciendolos en la pila, ademas al retornar una funcion la dirección a donde tiene que retornar la función también se encuentra en la pila.

La pila se tiene que mantener siempre estable, es decir, si comienza en el valor 0040892 (por ejemplo) siempre tendrá que estar en esa dirección, esa dirección base  esta establecida en rbp, si tu vas metiendo valores en la pila pero no vas restaurandola la pila se rompe y el programa estalla.

Código
  1. pushq %rbp ; Con estas dos intrucciones preservas la pila
  2. movq %rsp,%rbp
  3. ; Aqui vendriamos a sacar los parametros de la funciones de la pila y a usarlos
  4. movq %rbp, %rsp ; Aqui volveriamos a restarurar la pila tal y como estaba antes de comenzar la funcion
  5. popq %rbp
  6. ret ; Retornariamos la funcion

Para entenderlo tendrías que leer sobre lenguaje ensamblador ya que esto no ocurre en ningún otro lenguaje.

saludos.


En línea

Un byte a la izquierda.
xv0


Desconectado Desconectado

Mensajes: 1.026



Ver Perfil
Re: ¿Cómo funciona la pila con respecto a las funciones?
« Respuesta #2 en: 28 Octubre 2016, 15:57 pm »

Mira esto:

http://unixwiz.net/techtips/win32-callconv-asm.html

Pero en tu caso no tiene mucho sentido hacer eso, ya que estas usando el sistema fast syscall, no usas la pila para pasar parametros si no directamente los registros.

Un saludo.
En línea

GGZ

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: ¿Cómo funciona la pila con respecto a las funciones?
« Respuesta #3 en: 29 Octubre 2016, 00:42 am »

Las funciones están directamente relacionadas con la pila. Los parametros se le pasan a las funciones introduciendolos en la pila, ademas al retornar una funcion la dirección a donde tiene que retornar la función también se encuentra en la pila.

La pila se tiene que mantener siempre estable, es decir, si comienza en el valor 0040892 (por ejemplo) siempre tendrá que estar en esa dirección, esa dirección base  esta establecida en rbp, si tu vas metiendo valores en la pila pero no vas restaurandola la pila se rompe y el programa estalla.

Código
  1. pushq %rbp ; Con estas dos intrucciones preservas la pila
  2. movq %rsp,%rbp
  3. ; Aqui vendriamos a sacar los parametros de la funciones de la pila y a usarlos
  4. movq %rbp, %rsp ; Aqui volveriamos a restarurar la pila tal y como estaba antes de comenzar la funcion
  5. popq %rbp
  6. ret ; Retornariamos la funcion

Para entenderlo tendrías que leer sobre lenguaje ensamblador ya que esto no ocurre en ningún otro lenguaje.

saludos.


Leí bastante de ASM (lo de pila también pero no me quedó claro) y me conozco todos los registros, sólo que no sabía esto que me dijiste.
Sé que el registro rbp apunta a la base de la pila y en rsp está el último elemento agregado, sé que la pila crece hacia abajo pero, todavía no entiendo a qué te referis con preservar la pila, o sea que pasa si saco eso, ¿desborda no? pero sigo sin entender del todo.

Capaz si me tiras unos ejemplos un poco más sencillos mostrando el funcionamiento de la pila con respecto a las funciones entendería mejor.

Ojalá puedas hacerlo, gracias y saludos!



Creo que ya entendí un poco más de cómo funciona la pila.
Programé algunas cosas y lo compile usando -S entendí un poco más de todo.

Perdón por el doble post, estaba desde el cel.
Gracias, saludos.
« Última modificación: 30 Octubre 2016, 09:11 am por Eternal Idol » En línea

LET'S DO STUFF!!
Yuki

Desconectado Desconectado

Mensajes: 80


El error es una muestra de la incompetencia.


Ver Perfil WWW
Re: ¿Cómo funciona la pila con respecto a las funciones?
« Respuesta #4 en: 31 Octubre 2016, 00:40 am »

Bueno, espero poder explicarte lo mas claro posible, ya que a mi también se me complicó al momento de aprender esto.

Básicamente lo que haces es empujar la dirección base de la pila en la pila para "preservar" su valor, como si la asignaras en una variable de tipo entero, una vez ejecutado el código de tu procedimiento, si este no tiene errores, el único valor que te va a quedar en la pila es la dirección de la base de la pila real y mediante un "POP rbp" restauras el registro rbp para que tu programa siga ejecutándose correctamente.

Quiero resaltar fary, que generalmente los programas escritos en C/C++ utilizan la pila para preservar los valores de las variables, por si no se entendía lo del "el valor retornado por un procedimiento es almacenado en la pila".
En línea

GGZ

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: ¿Cómo funciona la pila con respecto a las funciones?
« Respuesta #5 en: 31 Octubre 2016, 01:59 am »

Sí, listo.

Lo entendí perfectamente, gracias.
En línea

LET'S DO STUFF!!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda respecto al terminal y respecto a Unix
GNU/Linux
idzen 4 3,063 Último mensaje 19 Noviembre 2013, 19:35 pm
por desikoder
Como usar la pila. « 1 2 »
Análisis y Diseño de Malware
TheEnmanuelRmrz 10 5,637 Último mensaje 19 Octubre 2014, 12:14 pm
por xv0
Re: Como usar la pila.
Análisis y Diseño de Malware
TheEnmanuelRmrz 0 2,031 Último mensaje 19 Octubre 2014, 06:08 am
por TheEnmanuelRmrz
¿Si uso un SO en virtualbox funciona correctamente con todas sus funciones?
Dudas Generales
Ori-chan 1 2,109 Último mensaje 8 Diciembre 2014, 22:49 pm
por Eleкtro
Respecto a la pila o memoria estatica..(o stack)
Programación C/C++
digimikeh 2 2,186 Último mensaje 4 Mayo 2019, 05:05 am
por digimikeh
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines