Программный счетчик при вызове подпрограмм сохраняется в активном системном стеке, равно как и восстанавливается из активного системного стека при возврате. При обработке прерываний и программных исключений программный счетчик и регистр состояния сохраняются в стеке супервизора (т.е. либо в стеке прерываний, либо в основном стеке). Таким образом, на выполнение программ в режиме супервизора не влияет ни поведение пользовательской программы, ни состояние стека пользователя, а пользователь, в свою очередь, имеет возможность оперировать указателем пользовательского стека независимо от потребностей супервизора в стековой памяти.
Для обеспечения более высокой эффективности по времени при работе со стеком, данные в нем хранятся выровненными на границы слов. При засылке байтового значения в стек указатель декрементируется на две единицы, а при выборке его - инкрементируется на ту же величину. Упомянутое значение хранится в старшем байте слова; младший байт не используется.
В микропроцессорной системе на базе MC68020 с двухсловной организацией памяти эффективность стековых операций (например, сохранение кадра исключения, вызов подпрограммы и т.д.) существенно возрастает, если значение указателя стека выравнивается на границу длинного слова.
2.11 СТЕКИ ПОЛЬЗОВАТЕЛЬСКОЙ ПРОГРАММЫ
Дополнительные программные стеки пользователя могут быть реализованы при использовании косвенной адресации через адресные регистры с постинкрементированием и предекрементированием. Используя адресные регистры (A0,...,A6), пользователь может реализовать стеки, растущие в сторону уменьшения адресов и наоборот. Важными являются следующие особенности:
при использовании предекрементирования содержимое регистра уменьшается до использования его как указателя стека;
при использовании постинкрементирования, содержимое регистра увеличивается после использования его как указателя стека.
При размещении в этих стеках байтов, слов и длинных слов вперемешку следует соблюдать осторожность.
Рост стека в сторону уменьшения адресов достигается при использовании адресации
-(An) для засылки данных в стек,
(An)+ для выборки из стека.
После операций засылки и выборки из стека регистр An указывает на верхнюю позицию стека. Это иллюстрируется следующим образом:
¦ младшие адреса ¦
+----------------+
¦ (свободно) ¦
+----------------+
An --> ¦ вершина стека ¦
+----------------+
¦ ......... ¦
+----------------+
¦ дно стека ¦
+----------------+
старшие адреса
Рост стека в сторону возрастания адресов достигается при использовании адресации
(An)+ для засылки данных в стек,
-(An) для выборки из стека.
После операций засылки и выборки из стека регистр An указывает на первую свободную позицию стека. Это иллюстрируется следующим образом:
¦ младшие адреса ¦
+----------------+
¦ дно стека ¦
+----------------+
¦ ......... ¦
+----------------+
¦ вершина стека ¦
+----------------+
An --> ¦ (свободно) ¦
+----------------+
старшие адреса
2.12 ОЧЕРЕДИ
Пользовательские очереди также могут быть реализованы с помощью косвенной адресации через адресные регистры с пост- и предекрементированием. Используя пару адресных регистров из набора
A0,...,A6, пользователь может реализовать очереди, которые пополняются либо в направлении уменьшения адресов, либо в обратном направлении. Поскольку пополнение очереди осуществляется с одного конца, а выборка - с другого, используются два регистра:
один - в качестве указателя чтения, а другой - в качестве указателя записи.
Рост очереди в сторону увеличения адресов реализуется при использовании адресации
(An)+ для записи данных в очередь
(An)+ для чтения данных из очереди.
После операции пополнения адресный регистр записи указывает на первое свободное место в очереди, а неизменившийся адресный регистр чтения - на следующий подлежащий выборке элемент очереди.
После операции выборки регистр чтения указывает на элемент очереди, который будет извлечен следующим, а неизменившийся регистр записи содержит адрес первой свободной ячейки за "хвостом" очереди. Это иллюстрируется следующей схемой:
¦ младшие адреса ¦
+--------------------------------+
¦ последний считанный (свободно) ¦
+--------------------------------+
Считать (Am)+ -->¦ следующий считываемый ¦
+--------------------------------+
..........................
+--------------------------------+
¦ последний записанный ¦
+--------------------------------+
Записать(An)+ -->¦ (свободно) ¦
+--------------------------------+
старшие адреса
Если очередь реализуется в виде кольцевого буфера, то используемые адресные регистры должны проверяться и, при необходимости, корректироваться перед выполнением операций пополнения или выборки. Адресный регистр корректируется вычитанием размера буфера (в байтах), что обеспечивает "замыкание на начало".
Рост очереди в сторону уменьшения адресов реализуется при использовании адресации
-(An) для записи данных в очередь
-(An) для чтения данных из очереди.
После операции пополнения адресный регистр записи указывает на последний помещенный в очередь элемент, а неизменившийся регистр чтения указывает на последний выбранный из очереди элемент. После операции выборки регистр чтения указывает на последний выбранный элемент очереди, а неизменившийся регистр записи содержит адрес последнего помещенного в очередь элемента.
Это иллюстрируется следующей схемой:
¦ младшие адреса ¦
+--------------------------------+
¦ свободно ¦
+--------------------------------+
Записать-(Am) -->¦ последний записанный ¦
+--------------------------------+
..........................
+--------------------------------+
¦ следующий считываемый ¦
¦--------------------------------¦
Считать -(An) -->¦ последний считанный (свободно) ¦
+--------------------------------+
старшие адреса
Если очередь реализуется в виде кольцевого буфера, то после операций пополнения или выборки используемые регистры должны проверяться и, при необходимости, корректироваться. Адресный регистр корректируется добавлением размера буфера (в байтах).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.