Регистр стека представляет собой компьютер центральный регистр процессора , целью которого является отслеживать в стеке вызовов . На компьютере с аккумуляторной архитектурой это может быть специальный регистр, такой как SP на машине Intel x86 . На машине общего регистра это может быть регистр, зарезервированный по соглашению, например, на машинах PDP-11 или RISC . В некоторых проектах, таких как Data General Eclipse, не было выделенного регистра, но для этой функции использовался зарезервированный адрес аппаратной памяти.
Машины до конца 1960-х годов, такие как PDP-8 и HP 2100, не имели компиляторов, поддерживающих рекурсию . Их инструкции подпрограммы обычно сохраняют текущее положение в адресе перехода, а затем устанавливают счетчик программы на следующий адрес. [1] Хотя это проще, чем поддержание стека, поскольку существует только одно место возврата на каждый раздел кода подпрограммы, рекурсия невозможна без значительных усилий со стороны программиста.
Стек машина имеет 2 или больше регистров стека - один из них отслеживает в стеке вызовов , другой (ие) Отслеживайте другого стека (ов).
Регистры стека в x86 [ править ]
В 8086 регистр основного стека называется указателем стека - SP. Регистр сегмента стека (SS) обычно используется для хранения информации о сегменте памяти, в котором хранится стек вызовов текущей исполняемой программы. SP указывает на текущую вершину стека. По умолчанию стек увеличивается вниз в памяти, поэтому новые значения помещаются в более низкие адреса памяти. Чтобы поместить значение в стек, используется PUSH
инструкция. Чтобы извлечь значение из стека, используется POP
инструкция.
Пример : Предположим, что SS = 1000h и SP = 0xF820. Это означает, что текущая вершина стека - это физический адрес 0x1F820 (это связано с сегментацией памяти в 8086 ). Следующие две машинные инструкции программы:
НАЖАТЬ ТОПОР НАЖАТЬ BX
- Эта первая инструкция должна передать значение, хранящееся в AX (16-битный регистр), в стек. Это делается путем вычитания значения 2 (2 байта) из SP.
- Новое значение SP становится 0xF81E. Затем ЦП копирует значение AX в слово памяти с физическим адресом 0x1F81E.
- Когда выполняется «PUSH BX», SP устанавливается в 0xF81C, а BX копируется в 0x1F81C. [2]
Это показывает, как работает PUSH. Обычно запущенная программа помещает регистры в стек, чтобы использовать регистры для других целей, например, для вызова подпрограммы, которая может изменять текущие значения регистров. Чтобы восстановить значения, хранящиеся в стеке, программа должна содержать такие машинные инструкции:
POP BX POP AX
POP BX
копирует слово по адресу 0x1F81C (старое значение BX) в BX, затем увеличивает SP на 2. Теперь SP равно 0xF81E.POP AX
копирует слово по адресу 0x1F81E в AX, затем устанавливает SP в 0xF820. [nb 1] [nb 2]
Механизм стека [ править ]
Более простые процессоры хранят указатель стека в обычном аппаратном регистре и используют арифметико-логический блок (ALU) для управления его значением. Обычно push и pop преобразуются в несколько микроопераций для отдельного добавления / вычитания указателя стека и выполнения загрузки / сохранения в памяти. [3]
Новые процессоры содержат специальный стековый движок для оптимизации стековых операций. Pentium M был первым процессором x86, в котором был реализован стек. В его реализации указатель стека разделен между двумя регистрами: ESP O , который является 32-битным регистром, и ESP d , 8-битным значением дельты, которое обновляется непосредственно операциями стека. Коды операций PUSH, POP, CALL и RET работают напрямую с регистром ESP d . Если ESP d близок к переполнению или на регистр ESP ссылаются другие инструкции (когда ESP d 0), вставляется микрооперация синхронизации, которая обновляет ESP O с помощью ALU и сбрасывает ESP dв 0. Эта конструкция осталась в значительной степени неизменной в более поздних процессорах Intel, хотя ESP O был расширен до 64 бит. [4]
Механизм стека, аналогичный Intel, также был принят в микроархитектуре AMD K8 . В Bulldozer необходимость в синхронизирующих микрооперациях была устранена, но внутренняя конструкция механизма стека неизвестна. [4]
Примечания [ править ]
Ссылки [ править ]
- ^ Саломон, Дэвид (февраль 1993 г.) [1992]. Написано в Калифорнийском государственном университете, Нортридж, Калифорния, США. Чиверс, Ян Д. (ред.). Сборщики и загрузчики (PDF) . Серия Эллиса Хорвуда в компьютерах и их приложениях (1-е изд.). Честер, Западный Суссекс, Великобритания: Ellis Horwood Limited / Simon & Schuster International Group . ISBN 0-13-052564-2. Архивировано (PDF) из оригинала 23 марта 2020 года . Проверено 1 октября 2008 .
Большинство компьютеров сохраняют адрес возврата либо в стеке, либо в одном из регистров, либо в первом слове процедуры (в этом случае первая исполняемая инструкция процедуры должна храниться во втором слове). Если используется последний метод, возврат из процедуры - это переход к той ячейке памяти, адрес которой содержится в первом слове процедуры.
(xiv + 294 + 4 страницы) - ^ Ховард, Брайан. «Учебник по сборке - Инструкции» . Департамент компьютерных наук, Университет ДеПау . Проверено 19 июля 2013 .
- ^ Стокс, Джон «Ганнибал» (2004-02-25). «Взгляд на ядро Centrino: Pentium M» . archive.arstechnica.com . п. 5.
- ^ a b Туман, Агнер. «Микроархитектура процессоров Intel, AMD и VIA» (PDF) . Технический университет Дании.