Цель работы: исследование особенностей записи и обращения к подпрограммам; изучение методов использования стека при создании программ.
Память микроЭВМ, построенной на основе МПК серии К580, может иметь не более 65536 однобайтных ячеек. Учитывая ограниченные возможности памяти при разработке программ, нужно стараться сделать их как можно короче. С этой целью часть программы, которая неоднократно повторяется, или программа, которая часто используется, могут быть оформлены в виде подпрограмм - последовательностей команд, выполнение которых может быть вызвано из любого места программы любое количество раз. Процесс передачи управления к подпрограмме называется ее вызовом. Данные и адреса, требуемые для работы подпрограммы, называются входными параметрами. Результаты работы подпрограммы, передаваемые по окончании ее работы в основную программу, называются выходными параметрами.
Для вызова подпрограмм используются команды CALL <А2><А1> и RST N, а для возврата из них - команда RET.
Команда CALL <А2><А1> загружает в программный счетчик МП содержимое байтов <А2><А1>, записанных в последующих двух адресах памяти после адреса, где записан код команды CALL (CD). Содержимое байта <А2> записывается в младший байт PCL программного счетчика, а третий байт <А1> команды - в старший байт РСН программного счетчика, при этом МП автоматически сохраняет в стеке адрес основной программы, к которому она будет обращаться после выполнения подпрограммы.
Команда RST N вызывает подпрограммы, записанные по восьми Фиксированным адресам в адресном пространстве МП.
Стек - область ОЗУ, используемая микроЭВМ для временного сохранения данных и работающая по дисциплине LIFO (число, записанное в стек последним, извлекается из него первым).
Команда RET (С9) помещает в программный счетчик последнее записанное на данный момент в стеке число. После этого выполнение программы будет осуществляться с этого адреса. Любая подпрограмма должна кончаться командой RET.
Автоматическое сохранение и восстановление адреса основной программы при выполнении подпрограмм позволяет сделать подпрограммы вложенными, т. е. осуществить вызов одной подпрограммы из другой. Уровень вложенности для данной микроЭВМ определяется лишь размером стека.
Существуют также команды условного вызова подпрограммы и возврата из них. Они позволяют вызвать подпрограмму и возвратиться из нее по определенному состоянию заданных разрядов регистра признаков (аналогично командам условных переходов) без использования дополнительных команд. Все команды условного вызова подпрограммы - трехбайтные, во втором и третьем байтах сообщается начальный адрес подпрограммы. Команды вызова подпрограмм и возврата из них используют стек и внутренний регистр МП SP (STACK POINTER) для адресации к стеку.
Помимо команд вызова подпрограмм и возврата из них со стеком можно обмениваться информацией с помощью команд PUSH <R> (записать в стек содержание обозначенного регистра МП) и POP <R> (записать данные из стека в обозначенный регистр МП). Эти команды являются однобайтными, и в них содержится указание пары регистров МП.
Примечание. В общем случае перед операциями со стеком необходимо загрузить в указатель стека (SP) значение начального адреса области стека. В учебной микроЭВМ УМПК-80 этого можно не делать, так как эта операция производится программой-монитором при включении микроЭВМ (см. выше).
При записи в стек содержимого пары регистров или программного счетчика по адресу SP - 1 записывается содержимое старшего регистра из указанной пары или старший байт РСН программного счетчика, а по адресу SP - 2 в стек записывается содержимое младшего регистра из указанной пары младшего байта PCL программного счетчика.
При записи из стека данных в пару регистров или программный счетчик в младший регистр пары или PCL записывается число из адреса, указанного в указателе стека SP, а старший регистр пары или PSH - число, записанное по адресу SP + 1. В результате выполнения команды содержимое указателя стека SP увеличивается на 2. Данные в памяти не изменяются, а лишь происходит их чтение и увеличение содержимого SP.
Таким образом, при записи данных адреса стека изменяются от больших к меньшими, а указатель стека SP всегда содержит последний адрес стека, в котором записано число.
При разработке программ необходимо первоначально назначать область стека, записывая в SP адрес с помощью команды LXI SP, <А2><А1> или команды SPHL.
Все операции со стеком должны быть сбалансированы, т. е. каждая подпрограмма должна содержать равное количество команд PUSH <R> и POP <R> и оканчивается командой RET. В противном случае выполнение команды RET в конце подпрограммы приведет к записи в программный счетчик случайного числа из стека. Адрес возврата в основную программу будет потерян и нарушится последовательность ее выполнения.
Как правило, в начале каждой программы сохраняют в стеке содержимое всех задействованных при ее выполнении регистров с помощью команд PUSH <R>. В конце подпрограммы восстановление содержимого регистров осуществляется с помощью команд POP <R> и в обратной последовательности по отношению к их записи в стек.
Обычно в виде подпрограмм записываются многократно используемые фрагменты программ, например подпрограмма выдачи звукового сигнала, подпрограмма обслуживания клавиатуры и дисплея и т. д.
Задания
1. Изучите команды вызова и возврата из подпрограммы по условию для МП.
2. Изучите программу 14, определяющую, какой из восьми переключателей входного устройства (адрес 05h) микроЭВМ установлен в положение "0"; а) составьте алгоритм работы программы 14; б) запишите подпрограмму, используемую в программе 14; в) установите, в каком регистре МП содержится информация о номере переключателя входного устройства, установленном в "0"; г) определите, как будет работать программа 14, если на входном устройстве будут установлены в положение "0" не один, а несколько переключателей.
Программа 14
Адрес
|
Код
|
Метка
|
Мнемокод
|
Комментарий
|
0800
|
DB 05
|
WAITC:
|
IN 05h
|
; Получить число из входного устройства
|
0802
|
FE FF
|
|
CPI FFh
|
; Содержит ли какой-либо разряд число 0
|
0804
|
CA 00 08
|
|
JZ WAITC
|
; Если нет, то ждать
|
0807
|
CD 0B 08
|
|
CALL IDSW
|
; Если да, то вызвать подпрограмму
; определения разряда, в котором
; записан 0
|
080A
|
CF
|
|
RST 1
|
; Окончить выполнение программы
|
080B
|
06 FF
|
IDSW:
|
MVI B, FFh
|
; Записать в регистр B число 0FFh
|
080D
|
04
|
SRCH:
|
INR B
|
; Увеличить содержимое регистра B на 1
|
080E
|
0F
|
|
RRC
|
; Сдвинуть число в аккумуляторе вправо
|
080F
|
DA 0D 08
|
|
JC SRCH
|
; Если CY = 1, то продолжать
|
0812
|
C9
|
|
RET
|
; Возврат из подпрограммы
|
3. Исследуйте программу 14.
3.1. Введите программу 14 в микроЭВМ.
3.2. Установите на входном устройстве переключатели соответственно числу 0FFh. Осуществить пуск программы. Убедитесь, что микроЭВМ будет находиться в режиме ожидания появления "0" в любом разряде входного устройства.
3.3. Установите "0" с помощью переключателей в любом из разрядов входного устройства. Проверьте содержимое регистров МП после окончания выполнения программы 14.
3.4. Осуществите повторный запуск программы при наличии нулей в двух разрядах входного устройства. Какое число будет записано в регистре B МП после окончания выполнения программы?
4. Исследуйте процесс выполнения команд вызова и возврата из подпрограммы, а также команд работы со стеком.
4.1. Введите в микроЭВМ подпрограмму 15.
Программа 15
Адрес
|
Код
|
Метка
|
Мнемокод
|
Комментарий
|
0800
|
CD 04 08
|
|
CALL STDY
|
;Вызвать подпрограмму STDY
|
0803
|
CF
|
|
RST 1
|
; Остановить выполнение подпрограммы
|
0804
|
F5
|
STDY:
|
PUSH PSW
|
; Записать слово состояние МП в стек
|
0805
|
C5
|
|
PUSH B
|
; Записать содержимое регистров B, C в стек
|
0806
|
D5
|
|
PUSH D
|
; Записать содержимое регистров D, E в стек
|
0807
|
E5
|
|
PUSH H
|
; Записать содержимое регистров H, L в стек
|
0808
|
3E 05
|
|
MVI A, 05h
|
; Записать в регистр A число 05h
|
080A
|
47
|
|
MOV B, A
|
; Записать число из регистра A в регистр B
|
080B
|
87
|
|
ADD A
|
; Удвоить содержимое аккумулятора
|
080C
|
5F
|
|
MOV E, A
|
; Записать содержимое регистра A в
; регистр E
|
080D
|
67
|
|
MOV H, A
|
; Записать содержимое регистра А в
; регистр H
|
080E
|
E1
|
|
POP H
|
; Записать числа из стека в регистры H, L
|
080F
|
D1
|
|
POP D
|
; Записать числа из стека в регистры D, E
|
0810
|
C1
|
|
POP B
|
; Записать числа из стека в регистры В, С
|
0811
|
F1
|
|
POP PSW
|
; Записать слово состояния из стека в МП
|
0812
|
C9
|
|
RET
|
; Возврат подпрограммы
|
4.2. Выполните программу 15 по командам. После каждой команды проверьте содержимое всех регистров МП.
4.3. Выполните команды CALL STDY, PUSH PSW, POP, RET по машинным циклам.
4.4. Замените в подпрограмме 15 команду POP PSW на команду NOP (00) и проследите, как будет выполняться подпрограмма 15. Объясните происшедшие изменения.
Содержание отчета
Отчет должен содержать: 1. Цель работы. 2. Результаты исследования выполнения программ 14-15. 3. Выводы.
|