Что такое направление роста стека программ?

Я читаю Professional Assembly Language Ричардом Блюмом, и я сбиваю с толку о несоответствии в книге, и мне интересно, что именно представляет собой направление роста стека программ? Это изображение со страницы 312, в котором говорится, что стек программ растет.

Но когда я достиг страницы 322, я вижу другую версию, которая предполагает, что пакет программ растет.

и этот

4 ответа

Книга не противоречива; на каждом рисунке показаны верхние адреса вверху.

Первый рисунок иллюстрирует стек, который растет вниз. Вызывающий вызывает параметры в стек, а затем вызывает новую функцию. Акт вызова толкает адрес возврата в стек. Затем вызывающая толкает текущее значение базового указателя на стек, копирует указатель стека в базовый указатель и уменьшает указатель стека, чтобы освободить место для локальных переменных вызываемого абонента.


Направление роста стека зависит от ОС, архитектуры процессора и, возможно, от ряда других факторов.

Наиболее распространенный макет имеет начало стека в верхней части памяти и растет, а куча начинается снизу и растет. Иногда это наоборот, например. MacOS до OSX помещал стек чуть выше области кода, рос, а куча начиналась в верхней части памяти и росла вниз.


Некоторая предыстория:

Для разных процессоров значение указателя стека и направление стека могут отличаться. Для стеков контроллеров TMS Piccolo растет, так что "PUSH" увеличит указатель стека. Указатель стека может указывать на последнее нажатое значение или на место, где записывается следующее значение, которое нужно нажать. ARM-процессор позволяет использовать все 4 возможных комбинации для стека, поэтому должно существовать соглашение о том, как использовать указатель стека.

На процессорах x86:

В x86-процессорах стек ALWAYS растет вниз, поэтому инструкция "PUSH" уменьшает указатель стека; указатель стека всегда указывает на последнее нажатое значение.

Первое изображение показывает, что адреса после указателя стека (адреs > указатель стека) уже содержат значения. Если вы храните больше значений в стек, они сохраняются в местах ниже указателя стека (следующее значение будет сохранено по адресу -16 (% ***)). Это означает, что изображение со страницы 312 также показывает вниз растущий стек.

- Изменить -

Если процессор имеет инструкцию "PUSH", направление роста стека задается процессором. Для процессоров, у которых нет инструкции "PUSH" (например, PowerPC или ARM без кода ARM-THUMB), операционная система должна определять направление роста стека.


Еще более убедительным определением направления роста стека является (если процессор имеет) стек прерывания. На некоторых архитектурах (например, PowerPC) на самом деле нет HW-стека. Затем разработчик системы может решить, каким способом реализовать стек: Pre-incrementing, post-incrementing. до-декрементирования или пост-декрементации.

В PPC вызовы используют регистр ссылок, а следующий вызов перезаписывает его, если адрес возврата не сохраняется программно.

Прерывания PPC используют 2 специальных регистра - "адрес возврата" и состояние машины. Это потому, что после прерывания инструкции могут быть перезапущены - способ обработки прерываний в конвейерной архитектуре.

pre-increment: указатель стека увеличивается до хранения в указателе push-стека на последний использованный элемент. Видно в нескольких более странных 8-битных архитектурах (некоторые четвертые процессоры и т.п.).

post-incrementing: сохранение выполняется до инкремента указателя стека - указатель стека указывает на первый элемент свободного стека.

до и после декрементов: аналогично выше, но стек растет вниз (чаще).

Наиболее распространенным является пост-декрементирование.

licensed under cc by-sa 3.0 with attribution.