¿Por qué las pilas normalmente crecen hacia abajo?


Sé que en las arquitecturas con las que estoy personalmente familiarizado (x86, 6502, etc), la pila normalmente crece hacia abajo (es decir, cada elemento empujado a la pila resulta en un SP decrementado, no uno incrementado).

Me pregunto sobre la lógica histórica de esto. Sé que en un espacio de direcciones unificado, es conveniente iniciar la pila en el extremo opuesto del segmento de datos (digamos), por lo que solo hay un problema si los dos lados chocan en el medio. Pero ¿por qué la pila tradicionalmente obtener la parte superior? Especialmente teniendo en cuenta que esto es lo contrario del modelo "conceptual"?

(Y tenga en cuenta que en la arquitectura 6502, la pila también crece hacia abajo, a pesar de que está limitada a una sola página de 256 bytes, y esta elección de dirección parece arbitraria.)

6 answers

En cuanto a la lógica histórica, no puedo decir con certeza (porque no los diseñé). Mis pensamientos sobre el asunto son que las primeras CPU tenían su contador de programa original establecido en 0 y era un deseo natural comenzar la pila en el otro extremo y crecer hacia abajo, ya que su código crece naturalmente hacia arriba.

Como un aparte, tenga en cuenta que este ajuste del contador de programa a 0 en el reinicio no es el caso para todas las CPU tempranas. Por ejemplo, el Motorola 6809 obtendría el contador de programa de direcciones 0xfffe/f para que pueda comenzar a ejecutarse en una ubicación arbitraria, dependiendo de lo que se suministró en esa dirección (generalmente, pero de ninguna manera limitado a, ROM).

Una de las primeras cosas que algunos sistemas históricos harían sería escanear la memoria desde la parte superior hasta que encuentre una ubicación que lea el mismo valor escrito, para que sepa la RAM real instalada (por ejemplo, un z80 con espacio de direcciones 64K no necesariamente tiene 64K o RAM, de hecho 64K habría sido masivo en mis primeros días). Una vez que encuentre la dirección real superior, establecería el puntero de la pila apropiadamente y podría entonces comenzar a llamar subrutinas. Este escaneo generalmente lo haría la CPU ejecutando el código en la ROM como parte del inicio.

Con respecto al crecimiento de las pilas, no todas crecen hacia abajo, vea esta respuesta para más detalles.

 41
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:12

Una buena explicación que escuché fue que algunas máquinas en el pasado solo podían tener compensaciones sin firmar, por lo que querrías que la pila creciera hacia abajo para poder golpear a tus locales sin tener que perder la instrucción adicional para falsificar un desplazamiento negativo.

 19
Author: anq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-10 00:45:06

Una posible razón podría ser que simplifica la alineación. Si coloca una variable local en la pila que debe colocarse en un límite de 4 bytes, simplemente puede restar el tamaño del objeto del puntero de la pila y luego poner a cero los dos bits más bajos para obtener una dirección correctamente alineada. Si la pila crece hacia arriba, asegurar la alineación se vuelve un poco más complicado.

 6
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-10 00:45:21

IIRC la pila crece hacia abajo porque la pila crece hacia arriba. Podría haber sido al revés.

 4
Author: Christian V,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-10 00:42:27

Creo que es puramente una decisión de diseño. No todos ellos crecen hacia abajo see ver este hilo SO para una buena discusión sobre la dirección del crecimiento de la pila en diferentes arquitecturas.

 2
Author: Kaleb Brasee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:19

Creo que la convención comenzó con el IBM 704 y su infame "registro de decremento". El discurso moderno lo llamaría un campo de desplazamiento de la instrucción, pero el punto es que fueron hacia abajo, no up .

 1
Author: luser droog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-23 10:21:54