Регистр стека - Stack register

А регистр стека это компьютерный центр регистр процессора чья цель - отслеживать стек вызовов. На аккумуляторная архитектура машине, это может быть специальный регистр, такой как SP на Intel x86 машина. На общем зарегистрировать машину, это может быть регистр, зарезервированный по соглашению, например, на PDP-11 или же RISC машины. Некоторые дизайны, такие как Данные General Eclipse не имел специального регистра, но использовал зарезервированный адрес аппаратной памяти для этой функции.

Машины до конца 1960-х годов, такие как PDP-8 и HP 2100 - не было компиляторов, поддерживающих рекурсия. Их инструкции подпрограммы обычно сохраняют текущее местоположение в адресе перехода, а затем устанавливают счетчик программы на следующий адрес.[1] Хотя это проще, чем поддержание стека, поскольку существует только одно место возврата на каждый раздел кода подпрограммы, без значительных усилий со стороны программиста не может быть рекурсии.

А штабелеукладчик имеет 2 или более регистров стека - один из них отслеживает стек вызовов, другие отслеживают другие куча (s).

Регистры стека в x86

В 8086, регистр основного стека называется указателем стека - SP. Регистр сегмента стека (SS) обычно используется для хранения информации о сегмент памяти что хранит стек вызовов текущей исполняемой программы. SP указывает на текущую вершину стека. По умолчанию размер стека в памяти увеличивается вниз, поэтому новые значения размещаются по более низким адресам памяти. Чтобы отправить значение в стек, ТОЛКАТЬ инструкция используется. Чтобы извлечь значение из стека, Поп инструкция используется.

Пример: Предполагая, что SS = 1000h и SP = 0xF820. Это означает, что текущая вершина стека - это физический адрес 0x1F820 (это связано с сегментация памяти в 8086 ). Следующие две машинные инструкции программы:

ТОЛКАТЬ ТОПОРТОЛКАТЬ BX
  • Эта первая инструкция должна протолкнуть значение, хранящееся в AX (16-битный регистр), в стек. Это делается путем вычитания значения 2 (2 байта) из SP.
  • Новое значение SP становится 0xF81E. Затем ЦП копирует значение AX в слово памяти с физическим адресом 0x1F81E.
  • Когда выполняется «PUSH BX», SP устанавливается в 0xF81C, а BX копируется в 0x1F81C.[2]

Это показывает, как работает PUSH. Обычно запущенная программа помещает регистры в стек, чтобы использовать регистры для других целей, например, для вызова процедуры, которая может изменять текущие значения регистров. Чтобы восстановить значения, хранящиеся в стеке, программа должна содержать такие машинные инструкции:

Поп BXПоп ТОПОР
  • 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О, который является 32-битным регистром, и ESPd, 8-битное значение дельты, которое обновляется непосредственно операциями стека. Коды операций PUSH, POP, CALL и RET работают напрямую с ESP.d регистр. Если ESPd близок к переполнению или на регистр ESP ссылаются другие инструкции (когда ESPd ≠ 0) вставляется микрооперация синхронизации, которая обновляет ESPО используя ALU и сбрасывает ESPd до 0. Эта конструкция осталась в значительной степени неизменной в более поздних процессорах Intel, хотя ESPО был расширен до 64 бит.[4]

Механизм стека, аналогичный Intel, также был принят в AMD K8 микроархитектура. В Бульдозер, необходимость в синхронизации микроопераций была устранена, но внутренняя конструкция механизма стека неизвестна.[4]

Примечания

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

Рекомендации

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