NOMBRE:
JORGE DAVID YAÑEZ GONZALEZ.
ZULMA MARIELA GONZALEZ RAMOS.
CATEDRATICO:
ING. OMAR VEGA ARRIAGA.
MATERIA:
SOFTWARE DE SISTEMAS.
CARRERA:
LIC. EN INFORMATICA. TURNO NOCTURNO.
FECHA:
13/ABRIL/2008.
1 JORGE DAVID YAÑEZ GONZALEZ.
ZULMA MARIELA GONZALEZ RAMOS.
Instrucciones Stack (pila).
"Stack" significa pila en inglés, pila en el sentido de
"apilar cosas", no de batería eléctrica.
Es una zona de la memoria en donde se guardan cosas.
Por ejemplo las variables locales de las subrutinas y
funciones, los parámetros, algunos resultados
intermedios de cálculos complejos, etc.
Todo el manejo del stack lo realiza el compilador de
forma automática, así que no hace falta preocuparse
salvo cuando se acaba el lugar y el programa genera un
error ("stack overflow").
Lo más importante de esta estructura es que en cada
momento sólo se tiene acceso a la parte superior del
stack (no a las cosas que están apiladas debajo).
Entonces cada subrutina puede guardar sus datos en el
stack, y las subrutinas a las que llame no los afectarán.
La pila es una zona de la memoria sobre la que se pueden
escribir y leer datos de forma convencional. Esta zona
tiene una posición especial que se denomina “la cima de la
pila”. El procesador contiene dos instrucciones de su
lenguaje máquina para realizar las operaciones de “apilar”
y “des apilar” datos de la pila. Los datos que se pueden
apilar y des apilar, en el caso del Intel Pentium son
siempre de tamaño 4 bytes.
2 JORGE DAVID YAÑEZ GONZALEZ.
ZULMA MARIELA GONZALEZ RAMOS.
El puntero de pila
Del funcionamiento de las instrucciones push y pop se
deduce que en algún lugar del procesador debe estar
almacenada la dirección de la cima de la pila y que dicho
valor es modificado por ambas instrucciones. En el caso
del Intel Pentium, esta dirección de memoria está
guardada por defecto en el registro de propósito general
%esp. Las dos últimas letras del nombre de este registro
corresponden con las iníciales de las palabras stack
pointer o “apuntador de pila”. La primera consecuencia de
esta característica del procesador es que, a pesar de
que dichos registros están, en principio, disponibles para
almacenar valores de forma temporal, el caso de %esp es
especial, pues es donde las instrucciones de manipulación
de la pila asumen que se encuentra la dirección de la
cima. El tamaño de este registro es de 32 bits que
coincide con el tamaño de toda dirección de memoria del
Intel Pentium.
3 JORGE DAVID YAÑEZ GONZALEZ.
ZULMA MARIELA GONZALEZ RAMOS.
Ejecución de instrucciones de pila
El que la dirección de la pila esté contenida en un
registro de propósito general permite que su contenido
sea manipulado como cualquier otro registro. Un
programa, por tanto, puede leer y escribir cualquier valor
de %esp, tan sólo se debe tener en cuenta que el
procesador obtiene de ese registro la dirección de
memoria necesaria para ejecutar las instrucciones push y
pop.
Supóngase que se ha depositado un cierto dato en la pila
mediante la instrucción push y que se encuentra, por
tanto en la cima. La instrucción pop deposita ese valor en
el lugar especificado pero, ¿es posible ejecutar la
instrucción pop sin ningún operando? En otras palabras,
la operación que se quiere ejecutar no es la de copiar el
dato de la cima, sino simplemente corregir el valor de la
cima al igual que haría pop pero sin depositar el dato en
ningún lugar. La instrucción pop, por definición, debe
incluir un único operando, con lo que no se puede utilizar
para hacer esta operación.
La solución se deriva del hecho de que la instrucción
ADD $4, esp su valor incrementado en cuatro unidades.
El efecto que esta instrucción tiene sobre la pila es el
deseado. La siguiente instrucción asume que la cima está
en la nueva posición contenida en %esp.
4 JORGE DAVID YAÑEZ GONZALEZ.
ZULMA MARIELA GONZALEZ RAMOS.
Operaciones
En lenguajes modernos, la pila es generalmente aplicada con más
de las operaciones de solo "push" y "pop". La duración de una pila
puede ser devuelta a menudo como un parámetro. Otra operación
de ayuda de arriba [1] (también conocido como mirar o pico) puede
devolver el elemento actual superior de la pila sin eliminarlo de la
pila.
En esta sección se ofrecen pseudocódigo para añadir o eliminar
nodos de una serie, así como la duración y las funciones arriba. A
lo largo vamos a usar nula para referirse a un final de la lista de
marcadores o valor centinela, que puede aplicarse de varias
maneras usando punteros.
Registro de datos Nodo (/ / Los datos están almacenados en el nodo
siguiente / / Una referencia al siguiente nodo; nulo para el último nodo)
Registro Stack Node stackPointer (/ / apunta a la 'top' nodo; nulo
para una pila vacía)
Función push (Pila pila, elemento de elemento) (/ / push nuevo
elemento en la pila (newNode) / / Asignar la memoria de celebrar nuevo
nodo [Link]: = elemento [Link]: = [Link]
[Link]: = newNode)
Función pop (Pila pila) (/ / incrementar el puntero de pila y volver
'top' de nodo / / Se puede comprobar si [Link] aquí es
nula. / / Si es así, puede que desee error, citando la pila underflow.
Nodo: = [Link] [Link]: = [Link] elemento: =
[Link] regreso elemento)
Función arriba (Pila pila) (/ / retorno 'top' nodo regreso
[Link])
Función longitud (Pila pila) (/ / devolver la cantidad de nodos en la pila
longitud: = 0 nodo: = [Link] mientras nodo no nulo (longitud:
= longitud + 1 nodo: = [Link] regreso longitud))
5 JORGE DAVID YAÑEZ GONZALEZ.
ZULMA MARIELA GONZALEZ RAMOS.
Aplicación
Un requisito típico de almacenamiento de una pila de n elementos
es O (n). El requisito típico tiempo de O (1) operaciones también
es fácil de satisfacer con un arreglo dinámico o vinculadas (por
separado) la lista de ejecución.
C + + 's Biblioteca de plantillas estándar proporciona una "pila"
templated clase que se limita a sólo empujar / pop operaciones.
Java contiene una biblioteca de la clase Pila que es una
especialización de Vector. Esto podría ser considerado como un
defecto, porque el diseño heredado get () de Vector método
LIFO ignora la limitación de la Pila.
Este es un ejemplo sencillo de una pila con las operaciones
descritas anteriormente (pero no hay comprobación de errores)
en Python.
Clase Stack (objeto): def __init__ (self):
libre. Stack_pointer = None def push (self,
elemento): libre. Stack_pointer = Nodo
(elemento, la libre. Stack_pointer) ganó pop
(libre): e = libre. Stack_pointer. Elemento
Libre. Stack_pointer = libre. Stack_pointer.
Próxima retorno e ganó a mirar (self): return
libre. Stack_pointer. Elemento def __len__
(self): i = 0 = libre sp. Stack_pointer
mientras sp: i + = 1 sp = sp. Próxima retorno I
clase Node (objeto): def __init__ (self,
elemento = None, siguiente = None): libre.
Elemento = elemento libre. Próxima = próximo si
__name__ == '__main__': # pequeño ejemplo uso s
= Stack (s) [ . Empuje (i) para i en xrange
(10)] imprimir [art pop () para i en xrange
(len (s))]
6 JORGE DAVID YAÑEZ GONZALEZ.
ZULMA MARIELA GONZALEZ RAMOS.
ARQUITECTURA BASICA DE UNA PILA.
7 JORGE DAVID YAÑEZ GONZALEZ.
ZULMA MARIELA GONZALEZ RAMOS.