Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Регистр стека представляет собой компьютер центральный регистр процессора , целью которого является отслеживать в стеке вызовов . На компьютере с аккумуляторной архитектурой это может быть специальный регистр, такой как 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]

Примечания [ править ]

  1. ^ Программа, представленная выше, первой выводит BX, потому что она была загружена последней.
  2. ^ В 8086инструкцииPUSH&POPмогут работать только с 16-битными элементами.

Ссылки [ править ]

  1. ^ Саломон, Дэвид (февраль 1993 г.) [1992]. Написано в Калифорнийском государственном университете, Нортридж, Калифорния, США. Чиверс, Ян Д. (ред.). Сборщики и загрузчики (PDF) . Серия Эллиса Хорвуда в компьютерах и их приложениях (1-е изд.). Честер, Западный Суссекс, Великобритания: Ellis Horwood Limited / Simon & Schuster International Group . ISBN 0-13-052564-2. Архивировано (PDF) из оригинала 23 марта 2020 года . Проверено 1 октября 2008 . Большинство компьютеров сохраняют адрес возврата либо в стеке, либо в одном из регистров, либо в первом слове процедуры (в этом случае первая исполняемая инструкция процедуры должна храниться во втором слове). Если используется последний метод, возврат из процедуры - это переход к той ячейке памяти, адрес которой содержится в первом слове процедуры. (xiv + 294 + 4 страницы)
  2. ^ Ховард, Брайан. «Учебник по сборке - Инструкции» . Департамент компьютерных наук, Университет ДеПау . Проверено 19 июля 2013 .
  3. ^ Стокс, Джон «Ганнибал» (2004-02-25). «Взгляд на ядро ​​Centrino: Pentium M» . archive.arstechnica.com . п. 5.
  4. ^ a b Туман, Агнер. «Микроархитектура процессоров Intel, AMD и VIA» (PDF) . Технический университет Дании.