МК
.pdfтимчасового збереження даних чи адрес. Число, записане до стека останнім,
витягається з нього першим.
Команда RET (C9) поміщає в програмний лічильник останнє записане на даний момент у стеці число. Після цього виконання програми здійснюватиметься з цієї адреси. Будь-яка підпрограма повинна завершуватися командою RET.
Автоматичне збереження і відновлення адреси основної програми під час виконання підпрограм дозволяє зробити підпрограми вкладеними, тобто здійснити виклик однієї підпрограми з іншої. Рівень вкладеності для мікро-
ЕОМ визначається лише розміром стека.
Існують також команди умовного виклику підпрограм і повернення з них.
Вони дозволяють викликати підпрограму і повернутися з неї за визначеним станом заданих розрядів регістра ознак (аналогічно командам умовних переходів). Усі команди умовного виклику підпрограми трибайтні, у другому і третьому байтах повідомляється початкова адреса підпрограми. Команди виклику підпрограм і повернення з них використовують стек і внутрішній регістр МП SP ( STACK POIN ТЕ R) для адресації до стек.
Крім команд виклику підпрограм і повернення з них зі стеком можна обмінюватися інформацією за допомогою команд PUS H <R> (записати в стек зміст позначеного регістра МП) і POP < R> (записати дані зі стека в позначений регістр МП). Ці команди є однобайтні, і в них міститься вказівка пари регістрів МП.
Для запису в стек вмісту пари регістрів чи програмного лічильника за адресою SP-1 записується вміст старшого регістра із зазначеної пари чи старший байт РСН програмного лічильника, а за адресою SP-2 у стек записується вміст молодшого регістра із зазначеної пари молодшого байта PCL
програмного лічильника.
Для запису зі стека даних у пари регістрів чи програмний лічильник у молодший регістр пари чи PCL записується число з адреси, зазначеної в
81
покажчику стека SP, а в старший регістр пари чи РСН – число, записане за адресою SP + 1. У результаті виконання команди вміст покажчика стека SP
збільшується на 2. Дані в пам'яті не змінюються, а лише відбувається їхнє читання і збільшення вмісту SP. Таким чином, під час запису дані адреси стека ростуть від великих до менших, а покажчик стека SP завжди містить останню адресу стека, в якому записане число.
Для розробки програм необхідно спочатку призначати область стека,
записуючи в SP адреси за допомогою команди LXI SP <А2> <А1> чи команди
SPHL.
Усі операції зі стеком повинні бути збалансовані, тобто кожна підпрограма повинна містити рівну кількість команд PUS H <R> і POP <R> і
завершується командою RET, якщо ж ні, то виконання команди RET наприкінці підпрограми призведе до запису в програмний лічильник випадкового числа зі стека. Адреса повернення в основну програму буде загублена і порушиться послідовність її виконання.
Як правило, на початку кожної програми зберігають у стеці вміст усіх задіяних для її виконання регістрів за допомогою команд PYSH <R>.
Наприкінці підпрограми відновлення вмісту регістрів здійснюється за допомогою команд POP <R> і в зворотній послідовності стосовно їхнього запису до стека.
Звичайно у вигляді підпрограм записуються багаторазово використовувані фрагменти програм, наприклад підпрограма видачі звукового сигналу, підпрограма обслуговування клавіатури і дисплея тощо.
Алгоритм роботи простої підпрограми тимчасової затримки показаний на рис. 11. Загальний час затримки обчислюється за формулою
TD = t1 + (t2 + t3 +t4) N1 + t5,
де N1 - число, спочатку записане в лічильнику. Як лічильник обраний регістр В, до якого записується число N1 з регістра С.
82
Команда NOP потрібна для збільшення часу виконання циклу, а отже, і
загальної затримки. Замість команди NOP може бути записана будь-яка послідовність команд, виконання яких не змінює вмісту регістрів мікропроцесора. Час запису числа N1 у регістр В і повернення з підпрограми t1+t5 фіксованій і у цикл не входить. Мінімальна затримка для приведеної підпрограми визначається за N1 = 0,1 і дорівнює
TDmin = t1 + t2 + t3 + t4 + t5 ,
Максимальна затримка має місце, коли N1 = 00 і обчислюється за формулою
Tdmax = t1 + (t2 + t3 + t4)256 + t5.
Підпрограма DLY (підпрограма 10, табл. 17) є підпрограмою тимчасової затримки, записаною відповідно до алгоритму, показаного на рис. 11.
Розглянемо приклад використання підпрограми тимчасової затримки для
організації звукових сигналів у мікро-ЕОМ (рис. 12) |
|
|
|||
|
|
|
|
|
|
|
Записати число N1 з регістра С у регістр В |
|
|
t1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Немає операції |
|
|
t2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Зменшити вміст регістра В на 1 |
|
t3 |
||
|
|
|
|
|
|
|
|
|
|
Ні |
|
|
|
|
|
||
|
|
|
|
||
|
В = 0 ? |
|
|
t4 |
|
|
|
|
|||
|
|
|
|
|
|
|
|
Так |
|
|
|
|
|
|
|
||
|
|
|
|
|
t5 |
|
Вихід з підпрограми |
|
|
||
|
|
|
|
|
|
Рис. 11. Алгоритм простої підпрограми тимчасової затримки.
83
Рис. 12. Схема формування звукових сигналів мікро-ЕОМ.
У мікро-ЕОМ звукові сигнали можуть формуватися найпростішою схемою (див. рис. 12), на вхід якої зі звуковою частотою записуються по черзі
"0" і "1". Вважатимемо, що пристрій формування звукових сигналів має адресу
80. Схема алгоритму роботи підпрограми генерації звукових коливань
(підпрограма 11, табл. 18) наведена на рис. 13.
CALL BPP
Записати у вихідний пристрій О
Викликати підпрограму DLY
Записати у вихідний пристрій 1
Викликати підпрограму DLY
Рис. |
RETURN |
13. |
|
Алгоритм підпрограми видачі звукового сигналу.
Програма MAIN (програма 12) є програмою генерації сигналів із частотою, що задається числом із вхідного регістра (табл. 19).
84
|
|
|
|
|
|
|
Таблиця 17 |
|
|
|
|
|
Підпрограма 10. |
||||
|
|
|
|
|
|
|
|
|
Адреса |
Машинний код |
Мітка |
|
Мнемокод |
Коментар |
|
||
0900 |
41 |
|
|
|
MOV B С |
записати число з регістра С у |
|
|
|
|
|
|
|
|
|
регістр В |
|
0901 |
00 |
DLY |
|
NOP |
|
немає операції |
|
|
0902 |
05 |
|
|
|
DCR В |
|
зменшити число в регістрі В |
|
|
|
|
|
|
|
|
на 1 |
|
0903 |
С2 0109 |
|
|
|
JNZ DLY |
якщо число, записане в |
|
|
|
|
|
|
|
|
|
регістрі В, не дорівнює нулю, |
|
|
|
|
|
|
|
|
то переходити на DLY |
|
0906 |
С9 |
|
|
|
RET |
|
|
|
|
|
|
|
|
|
|
Таблиця 18 |
|
|
|
|
Підпрограма 11 |
|||||
|
|
|
|
|
||||
Адреса |
Машинний код |
Мітка |
Мнемокод |
|
Коментар |
|
||
ОАОО |
AF |
ВРР |
|
XRA А |
очистити акумулятор |
|
||
ОАОІ |
D3 80 |
|
|
OUT BP |
записати 00 у вихідний пристрій |
|
||
ОАОЗ |
CD 0009 |
|
CALL DLV |
викликати підпрограму |
|
|||
|
|
|
|
|
|
затримки |
|
|
ОА06 |
2F |
|
|
|
СМА |
записати код ГГ в акумулятор |
|
|
ОАС7 |
D3 80 |
|
|
ОUТ ВР |
записати код ГГ у вихідний |
|
||
|
|
|
|
|
|
пристрій |
|
|
ОА09 |
CD 0009 |
|
CALL DLY |
викликати підпрограму |
|
|||
|
|
|
|
|
|
затримки |
|
|
ОАОС |
39 |
|
|
|
RET |
|
|
|
За рахунок зміни вхідних параметрів можна впливати на кінцевий результат виконання підпрограм. Розглянемо це на прикладі підпрограми регульованої тимчасової затримки (підпрограма 13, табл. 20).
|
|
|
|
Таблиця 19 |
|
|
|
|
Програма 12 |
||
|
|
|
|
|
|
Адреса |
Машинний код |
Мітка |
Мнемокод |
Коментар |
|
0800 |
DB 20 |
MAIN |
IN 20 |
записати число з вхідного |
|
|
|
|
|
регістра в акумулятор |
|
0802 |
4F |
|
MOV З А |
записати число в регістр ІЗ |
|
0803 |
CD OOOA |
|
CALL ВРР |
викликати підпрограму ВРР |
|
0806 |
СЗ 0008 |
|
JMP MAIN |
продовжувати, перехід на мітку |
|
|
|
|
|
MAIN |
|
85
Програма складається з двох підпрограм: DEL В (адреса 0430) і DELA (адреса 0429). Підпрограма DEL В здійснює регульовану тимчасову затримку, і
вхідним параметром її є двобайтне число, записане в парі регістрів (В, С). Це число і визначає тривалість затримки в мілісекундах.
|
|
|
|
Таблиця 20 |
|
|
|
|
Підпрограма 13 |
||
|
|
|
|
|
|
Адреса |
Машинний |
Мітка |
Мнемокод |
Коментар |
|
|
код |
|
|
|
|
0429 |
С5 |
DEL A |
PUSHB |
зберегти вміст регістрів В і С у |
|
|
|
|
|
стеці |
|
042А |
О1О1ОО |
|
LXIY 0001 |
встановити тривалість |
|
042D |
С3 3104 |
|
JMP DEL1 |
1 мс |
|
0430 |
С5 |
DELB |
PUSH B |
зберегти вміст регістрів В і С у |
|
|
|
|
|
стеці |
|
0431 |
F5 |
DELI |
PUSH PS W |
зберегти вміст PSW у стеці |
|
0432 |
AF |
|
XRA А |
очистити акумулятор |
|
0433 |
D5 |
|
PUSH D |
зберегти вміст регістрів D і Е в |
|
|
|
|
|
стеці |
|
0434 |
16 67 |
DEL 2 |
MVI D TIME |
завантажити лічильник |
|
0436 |
15 |
DEL З |
DCR D |
1 мс затримки зменшити вміст |
|
|
|
|
|
лічильника на 1 |
|
0437 |
С2 3604 |
|
JNZ DEL3 |
якщо не 0, продовжувати |
|
043 А |
0В |
|
DCX D |
зменшити вміст лічильника |
|
|
|
|
|
тривалості на 1 |
|
043В |
В8 |
|
СМР В |
|
|
043С |
С2 3404 |
|
JNZ DEL 2 |
|
|
043F |
В9 |
|
CMP C |
|
|
0440 |
С2 3404 |
|
JNZ DEL 2 |
якщо не 0, продовжувати |
|
0443 |
Dl |
|
POP D |
відновити вміст регістрів D, Е |
|
0444 |
FI |
|
POP PSW |
те саме, PSW |
|
0445 |
СІ |
|
POP В |
те саме, В, С |
|
0446 |
С9 |
|
RET |
|
|
Частковим випадком підпрограми DEL B є підпрограма DEL А, що здійснює фіксовану затримку в 1 мс і не має вхідних параметрів. Таким чином,
якщо необхідно мати в програмі фіксовану затримку в 1 мс, то можна звертатися за допомогою команди CALL до підпрограми DEL A. У разі необхідності одержання визначеної заданої тимчасової затримки в програмі
86
слід записати відповідне число в регістри В, С, а потім викликати підпрограму
DEL В.
Робота на навчальній ЕОМ
Навчальна мікро-ЕОМ містить схему видачі звукових сигналів. Адреса зовнішнього пристрою для запису даних у схему видачі звукових сигналів – 80.
Ряд підпрограм записаний у ПЗП мікро-ЕОМ. Зокрема, усі записані в ПЗП і наведені в описі лабораторної роботи програми мають адресу менше
0800.
Усі наведені в лабораторній роботі програми і порядок їхнього виконання можуть бути без будь-яких змін виконані на навчальній мікро-ЕОМ.
Порядок виконання роботи
1. Вивчити тимчасові діаграми виконання мікро-ЕОМ команд CALL
<A2> <А1> і RET.
2.Ознайомитись з командами виклику і повернення з підпрограми за умовою для МП.
3.Визначити, за яких чисел, записаних у регістрі В, підпрограма 9
здійснюватиме мінімальний і максимальний час затримки. Визначити цей час,
якщо машинний такт t = 1 мкс.
4.Розробити підпрограму 5-й 10-й секундної тимчасової затримки.
5.Скласти програму, що послідовно вимикає світлодіоди вихідного пристрою на час відповідно 10 і 5с. Для розробки програми скористатися підпрограмами, розробленими в п.4 завдання (рис. 14).
6.Визначити для підпрограми 13, за яких чисел у регістрах В і С буде максимальний і мінімальний час затримки. Визначити цей час, якщо машинний такт t - 1 мкс.
7.Розібрати програму 14 (табл. 21), що визначає, який з восьми перемикачів вхідного пристрою (адреса 20) мікро-ЕОМ встановлено в положенні "0": а) скласти алгоритм роботи програми 14; б) записати
87
підпрограму, використовувану в програмі 14; в) встановити, в якому регістрі МП міститься інформація про номер перемикача вхідного пристрою,
встановленого в "0" ; г) визначити, як працюватиме програма 14, якщо на вхідному пристрої будуть встановлені в положення "0" не один, а кілька перемикачів.
Отримати час затримки із вхідного регістра
Завантажити регістри В, С
Увімкнути світлодіоди вихідного регістра
Викликати підпрограму DЕL В
Вимкнути світлодіоди вихідного регістра
Викликати підпрограму DЕL В
Рис. 14. Алгоритм програми генератора імпульсів, заданої з
вхідного регістра частоти мікро-ЕОМ.
|
|
|
|
|
|
Таблиця 21 |
|
|
|
|
|
|
Програма 14 |
||
|
|
|
|
|
|
|
|
Адреса |
Машинний |
Мітка |
Мнемокод |
Коментар |
|||
код |
|||||||
|
|
|
|
|
|
||
0800 |
31 BOOB |
|
LXI SP |
записати в покажчик стека S Р адресу |
|||
|
|
|
ОВВО |
0900 |
|||
0803 |
DB20 |
WAITC |
IN |
20 |
одержати число з вхідного пристрою |
||
0805 |
FE FF |
|
СРІ |
FF |
чи містить якийсь розряд число 0 |
||
0807 |
СА0308 |
|
JZ |
WAITC |
якщо ні, то чекати |
||
080А |
CD I008 |
|
CALL IDSW |
якщо так, то викликати підпрограму |
|||
|
|
|
|
|
|
визначення розряду, у якому |
|
|
|
|
|
|
|
записаний 0 |
|
080D |
CF |
|
R S ТІ |
завершити виконання програми |
|||
0810 |
06 FF |
IDSW |
MVI В FF |
записати в регістр В число FF |
|||
0812 |
04 |
SRCH |
INR B |
збільшити вміст регістра В на |
|||
0813 |
OF |
|
|
RRC |
Змістити число в акумуляторі вправо |
||
|
|
|
|
|
|
на один розряд |
|
0814 |
DA1208 |
|
JC |
SRCH |
якщо “3”=1, то продовжувати |
||
0817 |
С9 |
|
|
RET |
повернення з підпрограми |
88
Завдання до лабораторної роботи
Завдання 1. Дослідити процес виконання команд виклику і повернення з підпрограми, а також команд роботи зі стеком.
Порядок виконання завдання
1. Ввести в мікро-ЕОМ підпрограму 15 (табл. 22).
|
|
|
|
|
Таблиця 22 |
|
|
|
|
Підпрограма 15 |
|||
|
|
|
|
|
|
|
Адреса |
Машинний |
Мітка |
Мнемокод |
Коментар |
|
|
|
код |
|
|
|
|
|
0800 |
31 BOOB |
|
LXI |
записати в покажчик стека SP |
|
|
|
|
|
SP,OBBO |
адресу ОВВО |
|
|
0803 |
CD 0708 |
|
CALL STDY |
викликати підпрограму STDY |
|
|
0806 |
CF |
|
RST |
І |
зупинити виконання |
|
|
|
|
|
|
підпрограми |
|
0807 |
F5 |
|
STDY PUSH |
записати слово стану МП БІС у |
|
|
|
|
|
PSW |
стек |
|
|
0808 |
С5 |
|
PUSH В |
записати вміст регістрів ВС у |
|
|
|
|
|
|
|
стек |
|
0809 |
D5 |
|
PUSH D |
записати вміст регістрів D, Е в |
|
|
|
|
|
|
|
стек |
|
080А |
Е5 |
|
PUSH H |
записати вміст регістрів Н, L у |
|
|
|
|
|
|
|
стек |
|
0808 |
ЗЕ 0 5 |
|
МVI А 05 |
записати в регістр А число 05 |
|
|
080D |
47 |
|
MOV В А |
записати число з регістра А в |
|
|
|
|
|
|
|
регістр |
|
080E |
87 |
|
ADD А |
подвоїти вміст акумулятора |
|
|
080F |
5F |
|
MOV E А |
записати вміст регістра А в |
|
|
|
|
|
|
|
регістр Е |
|
0810 |
67 |
|
MOV H А |
записати вміст регістра А в |
|
|
|
|
|
|
|
регістр Н |
|
0811 |
El |
|
POP H |
записати числа зі стека в |
|
|
|
|
|
|
|
регістри Н, L |
|
0812 |
DI |
|
POP D |
записати числа зі стека в |
|
|
|
|
|
|
|
регістри D, Е |
|
0813 |
СІ |
|
POP В |
записати числа зі стека в регістр |
|
|
|
|
|
|
|
В,С |
|
0814 |
FI |
|
POP |
PSW |
записати слово стану зі стека в |
|
|
|
|
|
|
МП БІСА |
|
0815 |
С9 |
|
RET |
повернення підпрограми |
|
89
2.Виконати програму 15 за командами, використовуючи режим виконання програми за командами. Після кожної команди перевірити вміст усіх регістрів МП.
3.Виконати команди CALL, STDY, PUSH PSW, POP, RET за машинними циклами і побудувати тимчасові діаграми їхнього виконання на мікро-ЕОМ.
4.Замінити в підпрограмі 15 команду POP PSW на команду N ОР (00) і
простежити, як виконуватиметься підпрограма 15. Пояснити зміни, що відбулися.
Завдання 2. Досліджувати програму тимчасової затримки на прикладі роботи програми генерації звукових коливань (програма 2).
Порядок виконання завдання:
1. Зібрати і під’єднати схему видачі звукових сигналів до мікро-ЕОМ так,
як показано на рис. 12.
2.Записати повний текст програми 12 для генерації звукових сигналів з урахуванням підпрограм 10 і 11. Ввести в мікро-ЕОМ програму.
3.Встановити на вхідному пристрої число 00.
4.Здійснити пуск програми з адреси 0800.
5.Простежити за зміною тону звуку, формованого мікро-ЕОМ у процесі виконання програми, збільшуючи число, записане у вхідному пристрої.
Завдання 3. Досліджувати програму регульованої тимчасової затримки на
прикладі програми, що послідовно вмикає і вимикає світлодіоди вихідного
пристрою на час відповідно 10 і 5 с.
Порядок виконання завдання
1.Ввести в мікро-ЕОМ програму, розроблену в п.5 завдання для домашньої підготовки.
2.Здійснити пуск програми і перевірити її виконання на мікро-ЕОМ.
3.Змінити числа, записані в регістрах В, С, в підпрограмі регульованої тимчасової затримки (підпрограма 13). Перевірити можливість зміни тривалості
90