Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: TR NOvato en 29 Marzo 2017, 21:38 pm



Título: que es una pila?
Publicado por: TR NOvato en 29 Marzo 2017, 21:38 pm
Perdón si la pregunta es muy básica pero la verdad,no encuentro una buena definición por así decirlo u.u.
estoy aprendiendo un poco de ensamblador y me dejo las dudas de,que es una pilas?
cual es la diferencia entre las subrutinas y las saltos cercanos(near jump)
que creo que se usan comúnmente con las etiquetas.
Si este tema ya esta en el foro pido disculpas,pero me encantaría que me lo ilustraran con algunos ejemplo si fuera posible u.u,gracias


Título: Re: que es una pila?
Publicado por: Poyoncio en 29 Marzo 2017, 21:49 pm
http://poyoncio.com/2017/02/03/Curso-ensamblador-10-Stack/

Saludos


Título: Re: que es una pila?
Publicado por: Serapis en 30 Marzo 2017, 00:54 am
Una pila es una estructura de datos. Si ya conoces el array, pués una pila es casi lo mismo, pero con la principal función de que los datos que se van metiendo, se extraen en orden inverso...
Una forma simple de entenderlo: Iagina una caja o un baúl... metes libros en él, si ahora quieres sacar uno, el que sacas es el último, porque es el que está arriba (en la cima), así para sacar el primero que metiste debes sacar primero todos los que tiene  encima.
Y dónde radica la importancia de esto?: en que está ordenado por orden de llegada, es ideal para atender las llamadas y todo tipo de rutinas anidadas...

Aplicándolo a ensambaldor en términos claros:
Supon que ejecutas una rutina... y que la actual instrucción que se está ejecutando es la dirección 00456789, y acto seguido haces un salto condicionado, entonces antes de hacer el salto, la dirección actual del registro PC (contador de programa) se guarda en la pila y acto seguido se salta a la dirección que apunta JMP,(esto pondrá en el registro PC, la dirección actual de ejecución), cuando se encuentre la instrucción de retorno, entonces se recurre a retonar la dirección de la pila que en este caso era 00456789 que se coloca de nuevo en el registro PC, y la ejecución continúa entonces en ese punto (actualizada) a la siguiente dirección tras el JMP que inició el salto...
Esto parece simple ó innecesario, para entenderlo mejor, imagina ahora que desde aquel sitio donde has saltado con JMP, hay alguna otra instrucción que reclama un salto... entonces nuevamente habrá que almacenar datos en la pila, incluso valores actuyales que tienen ciertos registros y que en la nueva dirección de salto, va a modificar... Así, si hay varios saltos consecutivos, cuando se termine una rutina, se rescata de la pila los datos tomados, para restablecer, los valores de los registros deseados y la posición dell contador de programa.

Respecto de los saltos NEAR y FAR... de un modo sencillo, si es near, basta guardar el valor del registro PC y eso ocupa x posivciones en la pila, pero si el salto queda fuera del registor actual, además del registro contador de programa, también debe guardarse el registro de segmento actual, porque en él se meterá el valor de otro registro de segmento, y por tanto, los datos a guardar en la pila y posteriormente a rescatar serían X + Y... Si lo simulas en un papel, te sserá muy fácil entenderlo...

Hay instrucciones que manejan la pila POP, POPA, POPAD, POPF, POPFD, PUSHF, POPF, PUSH, PUSHW,PUSHHD, PUSHA, PUSHAD, PUSHF, PUSHFD... el segmento de pila es SS y su registro el SP...
Los errores comunes que se cometen al operar con la pila suelen ser: guarda un número diferente de bytes de los que se rescatan luego, o rescatar un número diferente de bytes de los que se guardaron y exceder el limite de la pila...


Título: Re: que es una pila?
Publicado por: TR NOvato en 30 Marzo 2017, 02:09 am
Gracias por las respuestas :D, Poyoncio el curso que pones en tu pagina es hasta un nivel básico,intermedio,o algo avanzado ?
estoy estudiando full teoría u.u,no están poniendo tanto código en el curso pero bueno.