Виды машинных циклов. Слово состояния процессора. Слово состояния МП КР580ВМ80А. Ввод-вывод в режиме прерывания. Алгоритм обслуживания прерываний, страница 15

Стек предназначен для хранения содержимого регистровых пар микропроцессора. Под стек отводится любая область оперативной памяти МП. Вершину стека, то есть адрес первой ячейки области памяти, отведенной под стек, указывает содержимое 16-битного регистра – указателя стека SP. Загрузка SP адресом вершины стека осуществляется в начальных фрагментах программы управления МПУС (до его первого использования), например, командой LXI SP. Загрузка содержимого регистровых пар в стек может осуществляться по некоторым командам автоматически (при переходе к подпрограммам и при обслуживании прерываний текущее содержимое счетчика команд – адрес возврата – запоминается в стеке автоматически), а может происходить по команде загрузки в стек PUSH. При загрузке в стек содержимое указателя стека предварительно уменьшается на 1 и на ША выставляется этот адрес (то есть в ячейку, являющуюся вершиной стека, по этой команде ничего не помещается). В ячейку по этому адресу загружается содержимого старшего регистра регистровой пары. За время передачи этих данных содержимое SP еще раз уменьшается на 1, и содержимое младшего регистра пары пересылается в ячейку по вновь указанному указателем стека адресу. При следующей загрузке в стек происходит то же самое – декрементирование содержимого SP – пересылка данных из старшего регистра, второе декрементирование SP – пересылка данных из младшего регистра. Выгрузка из стека также может происходить автоматически (по окончании подпрограммы по команде RET адрес возврата автоматически заносится в счетчик команд) или по командам выталкивания из стека POP. Выгрузка из стека происходит в обратном порядке - сначала содержимое ячейки памяти, адрес которой в текущий момент находится в указателе стека, пересылается в младший регистр регистровой пары, указанной в коде команды POP. Затем содержимое SP инкрементируется (вернее, оно инкрементируется еще в процессе пересылки данных), и данные из ячейки, которую в данный момент адресует SP, пересылаются в старший регистр пары. После этого содержимое указателя стека еще раз увеличивается на 1. Таким образом получается, что данные, помещенные в стек последними, выгружаются из него первыми. Схематически принцип загрузки в стек данных из регистровых пар B и D и выгрузки этих данных из него показан на рис.4.2.

Так как область стека заполняется от старших разрядов к младшим, можно сказать, что стек растет вниз, и его вершина на схеме оказывается вверху. Процесс загрузки стека можно представить по другому – считать, что указатель стека неподвижен, а каждая загрузка в него приводит к «перемещению вверх» соответствующей области памяти. Именно из такого предположения следуют распространенные выражения «втолкнуть в стек» и «вытянуть из стека». Команды управления стеком однобайтные, так как в них используется косвенно-регистровый способ адресации данных (если точнее, то здесь используется два способа адресации – неявный, т.к. в коде команды указывается регистровая пара,
 участвующая в операции, и косвенный – в КОП содержится и код указателя стека, содержащего адрес ячейки памяти в стеке).

Команды управления стеком обычно используются для сохранения содержимого рабочих регистров и слова состояния МП при переходе последнего к обслуживанию запросов на прерывание (если содержимое этих регистров потребуется при возврате МП к выполнению основной программы). При составлении программы необходимо следить, чтобы после загрузки стека выгрузка его происходила строго в обратном порядке, чтобы не произошло взаимного обмена содержимым регистровых пар.

К специальным командам относятся команды разрешения и запрещения прерываний EI и DI, повторного запуска (рестарта)  RST и команда останова HLT.