Причина для декрементации SP заключается в том, что (*) стек добавляется к «снизу» (относительно места памяти). Было бы немного, если бы у вас было «список дел». Вы запустите его в верхней части страницы, и вместо того, чтобы отмечать отдельные вещи случайно в списке (как это обычно бывает), вы только начинаете и завершаете работу, которая наиболее удалена по странице.
Причина этого использования памяти сверху (то есть из более высоких адресов) для стека заключается в том, что она позволяет другое важное хранилище памяти, куча будет расти в другом направлении (по крайней мере, это имеет место в некоторые модели памяти). Продолжая аналог «делать список», теперь вы также пишете еще один список, скажем, список покупок, который находится внизу страницы. Тем не менее, этот список является кучей, вы позволили бы себе стереть вещи из него в случайных местах, когда вы проходите через магазин, а также повторно используете пространство, оставшееся от некоторых стираемых линий.
Теперь, рискуя добавить больше материала для путаницы, еще одним важным элементом управления стеком является концепция stack frame, что является удобным способом хранения параметров для функции и локальных переменных, которые соответствуют «общий контекст» вызовов вложенных функций.
(*) на многих CPU, то есть. Как отметил Пьер, некоторые процессоры работают со стеком, которые перемещают SP «вверх» (увеличивают его), когда на него нажимают вещи.
+1 для иллюстрации. – outis
Это потрясающе, спасибо за диаграмму – saint
, в какой точке будет стек ... переполнение? – Moak