
Микропроцессорные системы (УМКдляАИТ) / МетодУказания / Лаб. 1-5,6,7,7а,8,9,10 / Лаб4и5
.docЛАБОРАТОРНАЯ РАБОТА 4
Подпрограмма и стек
Цель работы - исследование особенностей записи и обращения к подпрограммам, изучение методов использования стека при создании программ.
КРАТКИЕ СВЕДЕНИЯ ИЗ ТЕОРИИ
Часть программы, которая неоднократно повторяется, или программы, которые часто используются, могут быть оформлены в виде подпрограмм-последовательностей команд, выполнение которых может быть вызвано из любого места программы и любое количество раз. Процесс передачи управления к подпрограмме называется ее вызовом. Данные и адреса, требуемые для работы программы, называются входными параметрами. Результаты работы подпрограммы, передаваемые по окончании ее работы в основную программу, называются выходными параметрами.
Для вызова подпрограмм и возврата из них используются команды CALL<A2><A1> и RЕТ (см. приложение).
Команда САLL<A2><A1> загружает в программный счетчик МП содержимое байтов <A2><A1>, записанных в последующих двух ячейках памяти после ячейки, в которой записан код команды CALL(СD). Содержимое байта <A2> записывается в младший байт РСL программного счетчика, а третий байт <A1> команды - в старший байт РСН программного счетчика, при этом МП автоматически сохраняет в стеке адрес основной программы, к которому она будет обращаться после выполнения программы.
Стек - специально организованная область ОЗУ, задействованная в микроЭВМ для временного сохранения данных или адресов. Число, записанное в стек последним, извлекается из него первым.
Команда RЕT (C9) помещает в программный счетчик число, записанное в стек последним. После этого выполнение программы будет осуществляться с адреса ячейки памяти, который определяется содержимым программного счетчика. Любая подпрограмма должна кончаться командой RET, чтобы обеспечить возврат в основную программу. Автоматическое сохранение и восстановление адреса основной программы при выполнении программ позволяет сделать подпрограммы вложенными, т.е. осуществить вызов одной подпрограммы из другой. Уровень вложенности для данной микроЭВМ определяется лишь размером стека.
В системе команд МП К580 имеются команды условного вызова подпрограмм и возврата из них. Эти команды позволяют вызвать подпрограмму и возвратиться из нее по определенному состоянию заданных разрядов регистра признаков (аналогично командам условных переходов). Все команды условного вызова подпрограммы - трехбайтные, во втором и третьем байтах сообщается начальный адрес подпрограммы. Команды вызова подпрограмм и возврата из них используют стек и регистр SP (указатель стека) для адресации к стеку.
Помимо команд вызова подпрограмм и возврата из них со стеком можно обмениваться информацией с помощью команд PUSH <R> (запись в стек содержания обозначенного регистра МП) и POP <R> (запись данных из стека в обозначенный регистр МП). Эти команды являются однобайтными, и в них содержится указание регистровой пары МП.
При записи в стек содержимого пары регистров или программного счетчика по адресу SP-1 записывается содержимое старшего регистра из указанной пары или старший байт РСН программного счетчика, а по адресу SP-2 в стек записывается содержимое младшего регистра из указанной пары или младшего байта РСL программного счетчика.
При записи из стека данных в пару регистров, или программный счетчик в младший регистр пары, или РСL записывается число из адреса, указанного в указателе стека SP, а в старший регистр пары или в РСН - число, записанное по адресу SP+1. В результате выполнения команды содержимое указателя стека SP увеличивается на 2. Данные в памяти (в стеке) не изменяются, а лишь происходит их чтение и увеличение содержимого SP. Таким образом, при записи данных адреса стека изменяются от больших к меньшим, а указатель стека SΡ всегда содержит последний адрес стека, в котором записано число.
При разработке программ необходимо первоначально назначать область стека, записывая в SP адрес с помощью команды LXI SP <A2><A1> или команды SPHL.
Все операции со стеком должны быть сбалансированы, т.е. каждая подпрограмма должна содержать равное количество команд PUSH <R> и POP <R> и оканчиваться командой RET. В противном случае выполнение команды RET в конце подпрограммы приведет к записи в программный счетчик случайного числа из стека. Адрес возврата в основную программу будет потерян и нарушится последовательность ее выполнения.
В начале каждой подпрограммы сохраняют содержимое всех задействованных при ее выполнении регистров с помощью команд PUSH <R> . В конце программы восстановление содержимого регистров осуществляется с помощью команд POP <R> и в обратной последовательности по отношению к их записи в стек.
Рассмотрим простую программу 11 временной задержки, алгоритм которой приведен на рис. 1. Этой программе дано имя BPI .
Рис. 1. Алгоритм временной задержки
ПОДПРОГРАММА 11
ΒΡΙ : MOV В,С Загрузка числа в регистр В из регистра С
MI : NOP Нет операции
DCR В Уменьшить на 1 содержимое регистра В
JNZ MI Цикл, если (В) ≠ 0
RET Возврат в основную программу, если В = 0
В качестве счетчика выбран регистр В, в который записывается число X из регистра С. Команда NОР нужна для увеличения задержки.
Для обеспечения требуемой временной задержки необходимо определить значение числа X, загружаемого в регистр В. Определение числа X можно выполнить на основе расчета времени выполнения команд, образующих данную подпрограмму. При этом необходимо учитывать, что команды МОV В,С и RET выполняются однократно, а число повторений команд NОР, DCR и JNZ. MI равно числу X, загруженному в регистр В. Кроме того, обращение к подпрограмме BPI осуществляется по команде CALL BPI, время выполнения которой также необходимо учитывать при определении временной задержки.
Длительность такта УОУ составляет 0,5 мкс. В описании системы команд МП K580BM80 указывается, за сколько тактов основной частоты синхронизации выполняются команды (см. приложение).
На основе этих данных можно записать:
CALL BPI - 17 тактов, T1 = 8,5 мкс;
|
MOV B,C - 5 тактов, Т2 = 2,5 мкс;
|
NOP - 4 такта, Т3= 2,0 мкс;
|
DCR В - 5 тактов, Т4 = 2,5 мкс;
|
JNZ MI - 10 тактов, Т5 = 5,0 мкс ;
|
RET - 10 тактов, Т6 = 5,0 мкс.
|
Общее время задержки можно вычислить по формуле:
Т = Т1 + Т2 + X · (Т3 + Т4 + Т5) + Т6.
Максимальная задержка имеет место при X = 00 (после первого декремента регистра В в нем устанавливается число 255) и будет равна:
Тмах = 8,5 +2,5 + 256 (2,0 + 2,5 + 5,0) +5,0 = 2448 мкс.
Минимальное время задержки будет при X = 01 и равно Тmin = 25,5 мкс.
Во многих случаях применения МП требуется сформировать длительные временные задержки (секунды, минуты и т.д.). Сформировать столь большую (для МП) задержку можно с использованием метода вложенных циклов подобно тому, как это показано на рис. 2.
Ниже приведена подпрограмма 12 формирования задержки, равной 1секунде.
ПОДПРОГРАММА 12 ( BP 2) |
||||
Адрес |
Код |
Мнемокод |
|
Комментарий |
8500 |
06 FF |
MVI B |
FF |
Загрузить в рег .В число |
8502 |
0Е FC |
MVI С |
FC |
Загрузить в рег. С число |
8504 |
0D |
DСR С |
|
Декремент регистра С |
8505 |
00 |
nop |
|
Нет операций |
8506 8507 |
00 00 |
nop nop |
|
|
8508 |
00 |
nop |
|
|
8509 |
С2 0485 |
JNZ |
8504 |
Цикл, если (С) ≠ 0 |
850С |
05 |
DCR B |
|
Декремент регистра В |
850D |
С2 0285 |
JNZ |
8502 |
Цикл, если (В) ≠ 0 |
8510 |
С9 |
RET |
|
Возврат в основную программу |
Рассмотрим программу 13 "Счетчик секунд на УОУ". В этой программе используются две подпрограммы. Подпрограмма DВ У ТΕ (CALL 0295), входящая в системную программу монитор и служащая для отображения содержимого аккумулятора в двух крайних правых разрядах дисплея. И используется подпрограмма ВР 2 ( CALL 8500) формирования секундной задержки.
Рис. 2. Блок-схема алгоритма задержки на 1 c
(подпрограмма 12 )
ΠΡΟΓΡΑΜΜΑ 13
|
|||||
Адрес ·
|
Код
|
Мнемокод
|
Комментарий
|
||
8400
|
3Е
|
00
|
MVI А
|
00
|
Обнулить аккумул.
|
8402
|
CD
|
95 02
|
CALL
|
0295
|
Вызвать подпрограмму индикации
|
8405
|
CD
|
00 85
|
CALL
|
8500
|
Вызвать подпрограмму ВР2
|
8408
|
С6
|
01
|
ADI
|
01
|
Сложить содерж. акк. с числом 01
|
340Α
|
C3
|
02 84
|
JMP
|
8402
|
Безусловный переход по адресу 8402, зацикливание программы
|
Как уже отмечалось в начале каждой подпрограммы для сохранения содержимого всех задействованных при ее выполнении регистров используют команды . ΡUSΗ <R> . В конце подпрограммы восстановление содержимого регистров осуществляется с помощью команд POP <R> и в обратной последовательности по отношению к записи в стек.
Ниже приведена подпрограмма ВР2, в которую введены команды PUSH и POP (подпрограмма ВР2А).
ПОДПРОГРАММА ВР2А |
|||
Адрес |
Код |
Мнемокод |
Комментарий |
8500 |
С5 |
PUSH В |
Запись в стек содерж. регистр. пары ВС |
8501 |
06 FF |
MVI В FF |
Загрузить рег. В |
8503 |
ОЕ FC |
MVI С FC |
Загрузить рег. С |
8505 |
00 |
NΟΡ |
Нет операции |
8506 |
00 |
NOP |
|
8507 |
00 |
NOP |
|
8508 |
00 |
NOP |
|
8509 |
од |
DCR C |
Декремент рег. С |
850А |
С2 0585 |
JNZ 8505 |
Цикл, если (С) ≠ 0 |
850D |
05 |
DCR В |
Декремент рег. В |
850Е |
02 0385 |
JNZ 8503 |
Цикл, если (В) ≠ 0 |
8511 |
CI |
POP В |
Восстановить содержимое регистров В и С |
8512 |
С9 |
RET |
Возврат в основную программу |
При разработке программ необходимо первоначально назначить область стека. В УОУ при нажатии клавиши RST или при получении команд RST0 программа монитор загружает в указатель стека SP начальный адрес стека 83Е0. Ниже приведена программа 14 с применением команды LХI SP, с помощью которой в начале программы загружается начальный адрес стека 8600 в указатель стека SP.
ПРОГРАММА 14
|
|||||
Адрес |
|
Код |
Мнемокод |
Комментарий |
|
8400 |
31 |
00 86 |
LXI SP 8500 |
Загрузить указатель стека SP |
|
8403
|
ЗЕ
|
00
|
MVI A
|
00
|
Обнулить аккум.
|
8405
|
CD
|
95 02
|
CALL
|
0295
|
Вызвать подпрограмму индикации
|
8408 |
CD |
00 85 |
CALL |
8500 |
Вызвать подпрограмму ВР2А |
840В
|
С6
|
01
|
АDI
|
01
|
Сложить содержимое акк. с числом 01
|
840D
|
C3
|
0584
|
JMP
|
8405
|
Безусловный переход по адресу 8405, зацикливание программы |
ЗАДАНИЕ ДЛЯ ДОМАШНЕЙ ПОДГОТОВКИ
1. Изучите временные диаграммы выполнения микроЭВМ команд CALL<A2>< Aj> и REΤ.
2. Ознакомьтесь с командами вызова и возврата команд по условию для МП Κ580[1,2,4,7,9].
3. Изучите организаций стека, запись и считывание данных в стеке.
4. Изучите подпрограммы 11, 12, 13, ВР2А и 14.
5. Составьте программу задержки,равной 20 с, используя подпрограмму ВР2А.
6. Изучите программу 15 и заполните таблицу.
-
ПРОГРАММА 15
Адрес
Код
Мнемокод
Комментарий
8450
31 00 86
LXI SP 8600
Загрузить в указатель стека SP адрес 8600
8453
СD 57 84
CALL 8457
Вызвать подпрограмму
8456
76
HLT
Останов
8457
F5
PUSH PSW
Записать слово-состояние в стек
8458
С5
PUSH В
Записать содержимое регистров В, С в стек
8459
D5
PUSH D
Записать содержимое регистров D,Е в стек
845А
Е5
PUSH H
Записать содержимое регистров H,L в стек
845В
3Е 05
MVI A 05
Записать в рег. А число 05
845D
47
МOV В,А
Переслать из рег. А в рег. В
845Е
87
АDD А
Удвоить содержимое рег. А
845f.
5F
MOV E,A
Переслать из рег. А в рег.Е
8460
67
MOV Н,А
Переслать из рег. А в рег.H
8461
E1
POP Н
Запись числа из стека в регистр H,L
8462
D1
POP D
Запись числа из стека в регистр D,E
8463
C1
POP В
Запись числа из стека в регистр В,С
8464
F1
POP PSW
Запись слова-состояния из стека в МП
8465
С9
RET .
Возврат в основную программу
Результаты изучения и выполнения программы 15
Имя регистра, адреса, стека
|
Содержимое регистров МП и ячеек стека в точках останова программы
|
|||||||||||
8450
|
8453
|
845A
|
845В
|
8465
|
8466
|
|||||||
Теор.
|
Практ.
|
Теор.
|
Практ.
|
Теор.
|
Практ.
|
Теор.
|
Практ.
|
Теор.
|
Практ.
|
Теор.
|
Практ.
|
|
A
|
01
|
|
|
|
|
|
|
|
|
|
|
|
B
|
02
|
|
|
|
|
|
|
|
|
|
|
|
C
|
03
|
|
|
|
|
|
|
|
|
|
|
|
D
|
04
|
|
|
|
|
|
|
|
|
|
|
|
E
|
05
|
|
|
|
|
|
|
|
|
|
|
|
Η
|
06
|
|
|
|
|
|
|
|
|
|
|
|
L
|
07
|
|
|
|
|
|
|
|
|
|
|
|
F
|
|
|
|
|
|
|
|
|
|
|
|
|
SPH
|
|
|
|
|
|
|
|
|
|
|
|
|
SPL
|
|
|
|
|
|
|
|
|
|
|
|
|
Стек
|
|
|
|
|
|
|
|
|
|
|
|
|
8600
|
|
|
|
|
|
|
|
|
|
|
|
|
85 FF
|
|
|
|
|
|
|
|
|
|
|
|
|
85 FE
|
|
|
|
|
|
|
|
|
|
|
|
|
…
|
|
|
|
|
|
|
|
|
|
|
|
|
85 PO
|
|
|
|
|
|
|
|
|
|
|
|
|