A регистр стека - это регистр центрального процессора компьютера, предназначенный для отслеживания стека вызовов . На машине с архитектурой с аккумулятором это может быть специальный регистр, такой как SP на машине Intel x86. На обычной машине с регистрами это может быть регистр, который зарезервирован по соглашению, например, на машинах PDP-11 или RISC. В некоторых проектах, таких как Data General Eclipse, не было выделенного регистра, но для этой функции использовался зарезервированный адрес аппаратной памяти.
На машинах до конца 1960-х, таких как PDP-8 и HP 2100, не было компиляторов, поддерживающих рекурсию. Их инструкции подпрограммы обычно сохраняют текущее местоположение в адресе перехода, а затем устанавливают счетчик программы на следующий адрес. Хотя это проще, чем поддержание стека, поскольку существует только одно место возврата на каждый раздел кода подпрограммы, без значительных усилий со стороны программиста не может быть рекурсии.
A стековая машина имеет 2 или более регистров стека - один из них отслеживает стек вызовов , другой (и) отслеживает другой стек .
В 8086, регистр основного стека называется указателем стека - SP. Регистр сегмента стека (SS) обычно используется для хранения информации о сегменте памяти, в котором хранится стек вызовов текущей исполняемой программы. SP указывает на текущую вершину стека. По умолчанию стек увеличивается вниз в памяти, поэтому новые значения помещаются в более низкие адреса памяти. Чтобы поместить значение в стек, используется инструкция PUSH
. Чтобы извлечь значение из стека, используется инструкция POP
.
Пример : Предполагается, что SS = 1000h и SP = 0xF820. Это означает, что текущая вершина стека - это физический адрес 0x1F820 (это связано с сегментацией памяти в 8086 ). Следующие две машинные инструкции программы:
PUSH AX PUSH BX
Это показывает, как 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 необходимость в синхронизирующих микрооперациях была устранена, но внутренняя структура механизма стека неизвестна.