¿Significa esto que el puntero base o el puntero de pila se mueven hacia abajo en las direcciones de memoria en lugar de subir? ¿Porqué es eso?
Sí, las push
instrucciones disminuyen el puntero de la pila y escriben en la pila, mientras que pop
hacen lo contrario, leen la pila e incrementan el puntero de la pila.
Esto es algo histórico en el sentido de que para máquinas con memoria limitada, la pila se colocó alta y se hizo crecer hacia abajo, mientras que el montón se colocó bajo y se hizo crecer hacia arriba. Solo hay una brecha de "memoria libre": entre el montón y la pila, y esta brecha se comparte, cualquiera puede crecer en la brecha según sea necesario individualmente. Por lo tanto, el programa solo se queda sin memoria cuando la pila y el montón chocan sin dejar memoria libre.
Si la pila y el montón crecen en la misma dirección, entonces hay dos huecos, y la pila realmente no puede crecer en la brecha del montón (lo contrario también es problemático).
Originalmente, los procesadores no tenían instrucciones de manejo de pila dedicadas. Sin embargo, a medida que se agregó soporte de pila al hardware, adoptó este patrón de crecimiento descendente, y los procesadores aún siguen este patrón hoy.
Se podría argumentar que en una máquina de 64 bits hay suficiente espacio de direcciones para permitir múltiples espacios, y como evidencia, múltiples espacios son necesariamente el caso cuando un proceso tiene múltiples hilos. Aunque esto no es suficiente motivación para cambiar las cosas, ya que con los sistemas de brechas múltiples, la dirección del crecimiento es posiblemente arbitraria, por lo que la tradición / compatibilidad inclina la balanza.
Habría que cambiar las instrucciones de manejo de la CPU pila con el fin de cambiar la dirección de la pila, o bien renunciar a la utilización de las empujando y haciendo estallar las instrucciones (por ejemplo, dedicados push
, pop
, call
, ret
, otros).
Tenga en cuenta que la arquitectura del conjunto de instrucciones MIPS no tiene push
& dedicado pop
, por lo que es práctico hacer crecer la pila en cualquier dirección: aún puede desear un diseño de memoria de un espacio para un proceso de subproceso único, pero podría aumentar la pila hacia arriba y el montón hacia abajo. Sin embargo, si hiciera eso, algunos códigos de C varargs podrían requerir un ajuste en la fuente o en el paso de parámetros bajo el capó.
(De hecho, dado que no hay un manejo dedicado de la pila en MIPS, podríamos usar pre o post incremento o pre o post decremento para empujar a la pila siempre que usemos el reverso exacto para saltar de la pila, y también asumiendo que el sistema operativo respeta el modelo de uso de pila elegido. De hecho, en algunos sistemas embebidos y algunos sistemas educativos, la pila MIPS crece hacia arriba).
-4(%rbp)
no mueve el puntero base en absoluto y que+4(%rbp)
no podría haber funcionado.