Указатель стека



Предыдущая | Следующая

Указатель стека
Ранее упоминалось, что для стека выделяется область ЗУПВ. Стек предназначен для сохранения содержимого регистров процессора, когда процессор должен обслуживать прерывание. Стек состоит из сотен последовательных байтов, каждый байт имеет адрес в карте памяти.
Для процессора очень важен начальный адрес стека, так как остальные байты можно адресовать, инкрементируя или декрементируя начальный адрес. Поэтому в процессоре имеется специальный 16-битовый регистр, называемый указателем стека (рис. 14.15).

Слово «указатель» означает адрес. Биты адреса в 16-битовом указателе стека показывают на первый байт стека. Стек может находиться в любой области памяти, поэтому для хранения адреса требуется 16-битовый регистр. Каждая ячейка является 8-битовым регистром. При прерывании содержимое всех регистров процессора, кроме указателя стека, можно сохранить в стеке. Для 8-битового регистра достаточно одного байта стека, а для 16-битовых регистров используются два байта стека. Содержимое указателя стека сохранять не нужно; его функция состоит в хранении начального адреса стека.
Указатель стека включен параллельно с программным счетчиком. Он может выдавать на шину адреса 16-битовый адрес, как и программный счетчик. Адрес на шине адреса становится содержимым указателя стека. Напомним, что указатель стека показывает начальный адрес стека. Рассмотрим, как процессор сохраняет содержимое своих регистров при прерывании.
В типичном двухфазном 8-битовом процессоре может быть девять регистров (рис. 14.16). Отметим 16-битовые регистры программного счетчика, индексного регистра и указателя стека. Фактически они состоят их двух связанных 8-битовых регистров. В старшей половине регистра содержатся старшие биты, а в младшей половине — младшие биты. Приведенный процессор имеет такие регистры:
• два аккумулятора А и В;
• старший и младший байты программного счетчика;
• старший и младший байты указателя стека;
• старший и младший байты индексного регистра;
• 8-битовый регистр кода условия CCR.
При выполнении программа определяет содержимое этих регистров. Когда устройство посылает в процессор бит прерывания и прерывание не замаскировано, процессор должен прервать программу и обслужить прерывание. Для выполнения процедуры прерывания потребуются регистры процессора. По окончании текущего машинного цикла процессор начинает обслуживание прерывания.
Для сохранения содержимого регистров процессор выдает биты указателя стека на шину адреса и выбирает первый байт. После этого процессор переходит к записи в байты стека. Сначала он помещает на шину данных биты регистра CCR и сохраняет их в первом байте. После этого проводится декремент указателя стека, и по этому адресу записывается содержимое аккумулятора А. Вновь проводится декремент указателя стека, и содержимое аккумулятора В записывается по этому адресу.

Предположим, что первый адрес стека равен 511. По этому адресу сохраняются биты регистра CCR. Содержимое аккумулятора А записывается по адресу 510, аккумулятора В — по адресу 509, старшая половина индексного регистра — по адресу 508, младшая половина индексного регистра — по адресу 507, старшая половина программного счетчика — по адресу 506 и младшая половина программного счетчика — по адресу 505. Указатель стека не сохраняется, так как в качестве регистра адреса нужен процессору всегда.
Регистр CCR сохранен по первому и максимальному адресу стека 511. Младшая половина программного счетчика сохранена по последнему и меньшему адресу 505. В это время указатель стека содержит последний адрес 505, по которому сохранена младшая половина программного счетчика.
После обслуживания прерывания процессор готов вернуться в прерванную программу. Для этого необходимо вернуть содержимое стека в регистры. В указателе стека находится последний адрес 505. Он выдается на шину адреса, и младшая половина программного счетчика считывается в регистр. Последний записанный в стек байт извлекается первым. Проводится инкремент указателя стека, в нем образуется адрес 506, процессор проводит считывание, и старшая половина программного счетчика возвращается в регистр. Инкремент указателя стека и считывания происходят до тех пор, пока все семь байтов не вернутся в регистры процессора.
Несмотря на то, что включение в стек и извлечение из стека кажутся сложными действиями, процессор легко выполняет их. При выполнении программы обращение к стеку проводится много раз. В операциях включения и извлечения указатель стека действует как программный счетчик.

 

 Поиск и устранение неисправностей в персональных компьютерах