Во всех CISC-процессорах аппаратно поддерживается стек, т.е. область оперативной памяти, предназначенная для временного хранения любой информации. Для стека характерны две операции: включение в стек "вталкивание" и извлечение "выталкивание" данных из стека. Включения и извлечение производятся с одного конца, называемого вершиной стека (Top Of Stack – TOS или Stack Top – ST), таким образом, что последнее включение в стек извлекается из него первым. Такая дисциплина называется LIFO (Last In – First Out, "последним пришел – первым ушел").
Предполагается, что область памяти для стека находится в специальном сегменте стека. В микропроцессорах Intel его адрес находится в паре SS:SP и SS:ESP, причем регистр SS содержит базу регистра, а вершина стека адресуется смещением в SP или ESP. Алгоритм работы со стеком в микропроцессоре i80386 и старше в P-режиме следующий:
В стек можно включить содержимое регистра, ячейки памяти или константу (процессор i8086/88 включать в стек константы не может). Извлечь данные из стека можно в регистр или ячейку памяти.
Как видно из предложенного алгоритма, сегмент стека заполняется не "с ног до головы" (т.е. от меньших адресов к большему), а наоборот, от больших адресов к меньшим. Это свойство сегмента специально указывается особым флажком в дескрипторе сегмента.
Сказанное относится к реализации стека в микропроцессорах корпорации Intel. В микропроцессорах Motorola вершина стека автоматически привязана к регистру A7 (и его копии A7' в режиме супервизора). Далее распределением базового адреса сегмента стека и управление его работой перекладывается на плечи операционной системы (т.е. на системного программиста). Отметим, что загрузка стека для программы супервизора осуществляется только при первоначальной загрузки процессора и программно недоступна, а загрузка стека программы пользователя является привилегированной командой и выполняется только в режиме супервизора. Об этом надо помнить, манипулируя со стеком на этой платформе.
Назад... К оглавлению раздела Далее...
=== *** === *** === *** ===
Copyright © Юрий А. Денисов. 2000-2002 г.
В настоящее время проект закрыт (в версии 1.00.3 alpha). Автор приносит извинения за прекрашение разработки.