Serapis
|
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...
|