Стек — это память с определенной (упрощенной) формой адресации.
Под стеком в микроЭВМ на базе МП КР58ОВМ80 понимается любая область ОЗУ, служащая для хранения содержимого внутренних регистров МП со специальным упрощенным режимом доступа. Основная задача стека — обслуживание прерываний.
В случае, когда нужно прекратить выполняемую последовательность команд, адрес подготовленной, но не выполненной команды, . посылается на хранение в стек. При необходимости возврата к прерванной программе адрес команды, с которой возобновляется прерванная программа, извлекается из стека.
Рисунок 1.6.2 - Упрощенная модель стека
Так можно выполнить последовательный ряд подпрограмм, в которых также предполагаются прерывания (вложенные прерывания). При этом стек заполняется адресами возврата к прерванным подпрограммам. Затем по мере извлечения адресов возврата к прерванным подпрограммам будет происходить их последовательное выполнение.
На рис. 1.6.2 представлена упрощенная модель стека. Ячейки стека имеют последовательно убывающую адресацию. Для организации обращения в верхнюю свободную ячейку памяти (дно свободного пространства стека) используется двухбайтовый указатель стека SP, расположенный в блоке регистров МП.
По мере заполнения стека содержимое SPуменьшается на единицу, когда же данные извлекаются из стека, содержимое SPувеличивается на единицу, причем SPвсегда указывает на адрес последней заполненной ячейки стека.
Увеличение или уменьшение содержимого стека производится с помощью схемы инкремента/декремента (I/D).
Рассмотрим работу стека на примере выполнения команды передачи управления подпрограмме CALL [адр.] и команды передачи управления главной программе RET.
При выполнении прерывания необходимо сохранить адрес команды подготовленной к выполнению, но не выполненной прерванной программы (по команде CALL), с тем чтобы в дальнейшем иметь возможность возврата к ней (по команде RET). Чтобы разместить в свободной ячейке старший байт адреса команды, надо подготовить адресное обращение к стеку, для чего содержимое указателя стека SPуменьшается на единицу SP(-1). После размещения старшего байта адреса содержимое указателя стека SPеще раз уменьшается на единицу SP(-2). По подготовленному адресу размещается младший байт адреса команды.
Формат команды CALL представлен на рис. 1.6.3, а.
По команде RET происходит извлечение адреса команды, с которой необходимо продолжить выполнение прерванной программы.
Старший байт адреса возврата извлекается по адресу, хранящемуся в SP; затем показание SPувеличивается на единицу SP(+1).
Младший байт адреса возврата извлекается по только что полученному по адресу в SP, после чего показание SPопять увеличивается на единицу SP(+2). Формат команды RET представлен на рис. 1.6.3, 6.
Рисунок 1.6.3 - Формат команды CALL и RET
|