Причиной уменьшения SP является то, что (*) стек добавляется «снизу» (относительно места в памяти). Это было бы немного похоже на список дел . Вы начнете это с верхней части страницы, и вместо того, чтобы отмечать отдельные вещи в списке случайным образом (как мы обычно это делаем), вы только начнете и закончите работу, которая находится дальше всего на странице.
Причина, по которой для стека используется память сверху (т. Е. С более высоких адресов), заключается в том, что она позволяет другому важному хранилищу памяти - кучи расти в другом направлении (по крайней мере, так обстоит дело в некоторых модели памяти). Продолжая аналогию с «списком дел», теперь вы также будете писать другой список , скажем, список покупок, в нижней части страницы. Однако, поскольку этот список является кучей, вы позволяете себе стирать вещи из него в случайных местах, проходя через магазин, а также повторно используя пространство, оставленное некоторыми из стертых строк.
Теперь, рискуя добавить больше материала для путаницы, другим важным элементом управления стеком является концепция фрейма стека , который является удобным способом хранения параметров для функции и локального переменные, которые соответствуют «общему контексту» вызовов вложенных функций.
(*) на многих процессорах, то есть. Как отметил Пьер, некоторые процессоры работают со стеком, который перемещает SP «вверх» (увеличивая его), когда на него что-то давит.