Регистр стека
Регистр стека — это регистр центрального процессора компьютера , целью которого является отслеживание стека вызовов . На машине с аккумуляторной архитектурой это может быть выделенный регистр. На машине с несколькими регистрами общего назначения это может быть регистр, зарезервированный по соглашению, например, в архитектуре IBM System/360 – z/Architecture и архитектуре RISC , или это может быть регистр, который вызывает инструкции и возвращает их. жестко закреплены для использования, например, в архитектурах PDP-11 , VAX и Intel x86 . Некоторые проекты, такие как Data General Eclipse , не имели выделенного регистра, но использовали для этой функции зарезервированный адрес аппаратной памяти.
Машины до конца 1960-х годов, такие как PDP-8 и HP 2100 , не имели компиляторов, поддерживающих рекурсию . Их подпрограммные инструкции обычно сохраняют текущее местоположение в адресе перехода, а затем устанавливают счетчик программы на следующий адрес. [1] Хотя это проще, чем поддерживать стек, поскольку в каждой секции кода подпрограммы имеется только одно место возврата, рекурсия не может быть осуществлена без значительных усилий со стороны программиста.
Стековая машина имеет 2 или более стековых регистра — один из них отслеживает стек вызовов , другой(и) отслеживает другой стек (и).
Регистры стека в 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. [2]
Это иллюстрирует, как работает PUSH. Обычно работающая программа помещает регистры в стек, чтобы использовать их для других целей, например, для вызова процедуры, которая может изменить текущие значения регистров. Чтобы восстановить значения, хранящиеся в стеке, программа должна содержать такие машинные инструкции:
POP BX
POP AX
POP BX
копирует слово по адресу 0x1F81C (старое значение BX) в BX, затем увеличивает SP на 2. SP теперь равно 0xF81E.POP AX
копирует слово по адресу 0x1F81E в AX, затем устанавливает SP в 0xF820. [номер 1] [номер 2]
Стековый движок [ править ]
Более простые процессоры хранят указатель стека в обычном аппаратном регистре и используют арифметико-логическое устройство (АЛУ) для управления его значением. Обычно 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 г.
- ^ Стоукс, Джон «Ганнибал» (25 февраля 2004 г.). «Взгляд на ядро Centrino: Pentium M» . archive.arstechnica.com . п. 5.
- ^ Jump up to: Перейти обратно: а б Туман, Агнер. «Микроархитектура процессоров Intel, AMD и VIA» (PDF) . Технический университет Дании.