Регистр стека

редактировать

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

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

A стековая машина имеет 2 или более регистров стека - один из них отслеживает стек вызовов , другой (и) отслеживает другой стек .

Содержание
  • 1 Регистры стека в x86
  • 2 Механизм стека
  • 3 Примечания
  • 4 Ссылки
Регистры стека в x86

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

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

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

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

POP BX POP AX
  • POP BXкопирует слово по адресу 0x1F81C (которое является старым значением BX) в BX, затем увеличивает SP на 2. Теперь SP равен 0xF81E.
  • POP AXкопирует слово с 0x1F81E в AX, затем устанавливает SP в 0xF820.
Механизм стека

Более простые процессоры сохраняют указатель стека в обычном аппаратном регистре и используйте арифметико-логический блок (ALU) для управления его значением. Обычно push и pop преобразуются в несколько микроопераций, чтобы отдельно добавить / вычесть указатель стека и выполнить загрузку / сохранение в памяти.

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

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

Примечания
Ссылки
Последняя правка сделана 2021-06-09 07:01:58
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте