МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет "Львівська політехніка"
ПІДПРОГРАМА І СТЕК
РОЗРОБЛЕННЯ ПРОСТИХ ПРОГРАМ
ІНСТРУКЦІЯ
ДО ЛАБОРАТОРНОЇ РОБОТИ № 3 З КУРСУ
"МІКРОПРОЦЕСОРНІ ПРИСТРОЇ"
для студентів базового напряму 6.160100
“Інформаційна безпека”
Затверджено
на засіданні кафедри
"Автоматика та телемеханіка"
Протокол №6 від 30.11.1999р.
ЛЬВІВ 2006
Підпрограма і стек. Розроблення простих програм. Інструкція до лабораторної роботи № 3 з курсу "Мікропроцесорні пристрої" для студентів базового напряму 6.160100 “Інформаційна безпека”. /Укл. І. М. Бучма, А. Й. Наконечний.- Львів: НУЛП, 2006.- 11 с.
Укладачі: І. М. Бучма, канд. техн. наук, доц.,
А. Й. Наконечний, канд. техн. наук, доц.
Відповідальний за випуск І. М. Ковела, канд. техн. наук, доц.
Рецензенти: З. Р. Мичуда, канд. техн. наук, доц.
М. В. Наконечний, канд. техн. наук, доц.
Мета роботи – дослідження особливостей складання підпрограм та звертання до них; вивчення методів розроблення програм та використання стеку при створенні програм.
І. ТЕОРЕТИЧНІ ПОЛОЖЕННЯ
Для зменшення затрат часу на складання програм, а також для зменшення об’єму необхідної для зберігання цих програм пам’яті, намагаються зробити програми коротшими. Тому ту частину програми, що багатократно повторюється, або програму, що часто використовується, виконують у вигляді підпрограми - послідовності команд, виконання яких може бути викликане з будь-якого місця програми будь-яку кількість разів.
Процес передачі управління підпрограмі називається її викликом.
Дані та адреси, що необхідні для роботи підпрограми, називаються вхідними параметрами. Результати роботи підпрограми, що по її закінченні мають бути передані в основну програму, називаються вихідними параметрами.
Для виклику підпрограм та повернення з них використовують команди CALL ADDR та RET.
Команда CALL ADDR завантажує в програмний лічильник PC мікропроцесора вміст байтів ADDR (початкова адреса підпрограми), що записані в наступних двох комірках пам’яті після коду команди CALL(CD). Після коду CD зразу записується молодший байт адреси, а наступним слідує старший байт адреси. При цьому мікропроцесор автоматично зберігає в стеку адресу команди основної програми, до якої він повернеться після виконання підпрограми.
Стек - це частина (область) оперативного запам’ятовуючого пристрою (ОЗП), що використовується мікропроцесором для тимчасового зберігання даних та адрес. Дані, що записані в стек останніми, виймаються з нього першими.
Команда RET завантажує із стека в програмний лічильник останнє записане на даний момент число. Це число є адресою команди основної програми, з якої почнеться її виконання. Тому будь-яка підпрограма повинна закінчуватися командою RET.
Автоматичне збереження і відновлення адреси основної програми при виконанні підпрограм дозволяє вкладати підпрограми одну в іншу, тобто здійснювати виклик однієї підпрограми з іншої. При цьому рівень вкладання визначається лише розміром стеку.
Є також команди умовного виклику підпрограми та умовного повернення з них. Вони дозволяють викликати підпрограму і повернутися з неї при умові певного стану прапорців регістру F (аналогічно тому як це є в командах умовних переходів). Всі команди умовного виклику підпрограми - трьохбайтні. В другому і третьому байтах команди міститься початкова адреса підпрограми. Всі команди виклику підпрограм та повернення з них використовують стек. При цьому для адресації до стеку використовується вказівник стеку SP (STACK POINTER).
Крім команд виклику підпрограм та повернення з них із стеком можуть обмінюватися інформацією регістрові пари мікропроцесора PSW, BC, DE,HL з допомогою команд PUSH RP (записати в стек вміст вказаної в команді регістрової пари) та POP RP (завантажити дані зі стеку у вказану в команді регістрову пару). Команди PUSH RP та POP RP є однобайтними.
При роботі зі стеком треба мати на увазі, що вказівник стеку SP завжди вказує на останню заповнену комірку стеку. Тому при записуванні в стек вмісту регістрової пари або програмного лічильника PC вміст старшого регістру вказаної пари заноситься в комірку стекової пам’яті за адресою SP-1, а за адресою SP-2 в стек записується вміст молодшого регістру вказаної пари.
При завантаженні зі стеку даних в регістрову пару в молодший регістр пари записується число з адреси, що вказується вказівником стеку SP, а в старший регістр пари - число, записане за адресою SP+1. Тобто при цьому вміст вказівника стеку SP збільшується на 2. При цьому дані в комірках стеку не змінюються, а лише відбувається їх читання та збільшення вмісту SP.
Таким чином, при записуванні даних в стек адреси у вказівнику стеку SP змінюються від більших значень до менших, а при читанні даних із стеку адреси у вказівнику стеку SP змінюються від менших значень до більших.
При розробці програм необхідне початкове задання області стеку шляхом завантаження у вказівник стеку SP адреси з допомогою команди LXI SP, D16 або команди PCHL завантаження вказівника стеку SP вмістом регістрової пари HL.
Всі операції зі стеком повинні бути збалансованими, тобто кожна підпрограма повинна містити рівну кількість команд PUSH RP і POP RP та закінчуватися командою RET. В іншому разі виконання команди RET в кінці підпрограми приведе до запису в лічильник команд SP із стеку випадкового числа. Адреса повернення в основну програму буде втрачена, а це приведе до порушення послідовності її виконання.
Як правило, на початку кожної підпрограми зберігають в стеку вміст всіх задіяних при її виконанні регістрових пар за допомогою команд PUSH RP. В кінці підпрограми відновлення вмісту регістрових пар здійснюється командами POP RP. Відновлення вмісту регістрових пар необхідно проводити в зворотній послідовності.
Звичайно у вигляді підпрограм оформляються фрагменти програм, що багатократно повторюються, напр., підпрограми обслуговування клавіатури та дисплея, підпрограма подачі звукового сигналу, часової затримки і т.д.
Алгоритм роботи простої підпрограми часової затримки подано на рис. 1
Загальний час затримки можна підрахувати за формулою
де t0 – час виклику підпрограми; t1 – час переписування числа N з регістру С в регістр В; t2 – час виконання холостої команди NOP; t3 – час зменшення вмісту регістру B на одиницю; t4 – час порівняння вмісту регістру B; t5 – час повернення з підпрограми.
Команда NOP використовується для збільшення часу виконання циклу, а значить, і загальної затримки. Замість команди NOP може бути використана будь-яка послідовність команд, виконання яких не змінює вмісту регістрів мікропроцесора. Час виклику підпрограми, запису N в регістр B та час повернення з підпрограми фіксовані і в цикл не входять.
Приведена нижче підпрограма 1 (Delay) є підпрограмою часової затримки, алгоритм якої подано на рис. 1.
Підпрограма 1
Адреса
Машинний код
Мітка
Мнемокод
Коментар
*
*
*
*
CD5082
CALL Delay
Виклик п/п часової затримки Delay.
*
*
*
8250
41
Delay
MOV B,C
Записати число з регістру C в регістр B.
8251
00
Label_1
NOP
Нема операції.
8252
05
DCR B
Зменшити число в регістрі B на 1.
8253
C25182
JNZ Label_1
Якщо число в регістрі B(0, то іти на Label_1.
8256
C9
RET
Повернення в основну програму.
Сучасна методика програмування полягає в тому, що програму намагаються представити з деякого числа стандартних структур. Їх називають програмними модулями або блоками.
Складні блоки програми ділять на менші субблоки до такого рівня, щоб програмування кожного з них стало очевидним в командах мікропроцесора.
Будь-яка програма може бути побудована комбінацією трьох груп базових програмних блоків: 1) функціональних (послідовних); 2) циклів (повторення); 3) розгалуження (альтернативного рішення).
1. Послідовна структура - найбільш поширена. Вона означає, що дві дії повинні бути виконані одна за другою. Для прикладу дивись рис. 2.
2. Цикли застосовують тоді, коли ряд команд необхідно повторювати кілька разів підряд, виконуючи між повтореннями лише незначні модифікації. В такому випадку можна скоротити об’єм програми, якщо багатократно використовувати одну і ту ж програму, а не записувати одні і ті ж команди кілька разів. Такий процес називається організацією циклу.
В циклі завжди присутні чотири блоки: 1) підготовки даних; 2) основних дій (тіло циклу); 3) підготовки до наступного циклу (модернізація); 4) перевірки умови. Всі ці блоки обов’язково присутні в кожному циклі, але порядок слідування їх може бути різним. При цьому цикли можуть бути двох типів: 1) з післяперевіркою (рис. 3); 2) з передперевіркою (рис. 4).
Основна різниця обох форм циклів у тому, що з післяперевіркою цикл виконується як мінімум один раз, а при передперевірці цикл може не виконуватися жодного разу.
3. Розгалуження програми забезпечує вибір між двома напрямками ходу програми (рис. 5).
Для цього робиться перевірка умови. Кожен з шляхів програми веде до точки злиття, так що програма буде виконуватися незалежно від того, який шлях вибрано.
Розглянемо приклад використання підпрограми часової затримки при організації звукових сигналів в МП пристрої (підпрограма 2).
В найпростішому випадку звукові сигнали можуть формуватися почерговим записом 0 та 1 на пристрій формування звукових сигналів із звуковою частотою. Будемо вважати, що пристрій формування звукових сигналів має адресу 80. Схема алгоритму роботи підпрограми генерування звукових коливань (підпрограма 2) подана на рис.6.
Підпрограма 2
Адреса
Машинний код
Мітка
Мнемокод
Коментар
8100
AF
AUDIO
XRA A
очистити акумулятор
8101
D3 80
OUT 80
записати 00 у вихідний пристрій
8103
CD 5082
CALL INT
викликати підпрограму затримки
8106
2F
CMA
записати код FF в акумулятор
8107
D3 80
OUT 80
записати код у вихідний пристрій
8109
CD 5082
CALL INT
викликати підпрограму затримки
810С
С9
RET
вийти з підпрограми
Підпрограму 2 використаємо в програмі MAIN, що є програмою генерації сигналів з частотою, що задається числом з вхідного порту, адреса якого 20.
Програма MAIN
Адреса
Машинний код
Мітка
Мнемокод
Коментар
8000
DB 20
MAIN
IN 20
ввести число з вхідного порту
8002
4F
MOV C,A
записати число в регістр С
8003
CD 0081
CALL AUDIO
викликати підпрограму AUDIO
8006
C3 0080
JMP MAIN
продовжувати
Завдання для домашньої підготовки:
1. Ознайомитися з командами безумовного виклику підпрограми мікропроцесора КР580ИК80А (CALL ADDR) і командою безумовного виходу з підпрограми (RET).
2. Ознайомитися з умовними командами виклику підпрограми та повернення з неї.
3. Визначити, при яких числах в регістрі B підпрограма 1 забезпечить максимальний і мінімальний час затримки. Визначити ці часи, якщо тривалість такту T=1мкс.
4. Розберіть програму KEY, що визначає, який з восьми перемикачів вхідного пристрою (адреса 20) встановлений в положення 0. Для цього: 1) складіть алгоритм роботи програми KEY; 2) запишіть підпрограму, що використовується в програмі KEY; 3) визначте в якому регістрі мікропроцесора знаходиться інформація про номер перемикача вхідного пристрою, що встановлений в 0-стан; 4) визначте, як буде працювати програма KEY, якщо на вхідному пристрої будуть встановлені в 0 не один, а кілька перемикачів. (Увага! В програмі KEY команда вводу даних з вхідного пристрою 20 (IN 20) імітується командою MVI A, DATA. Змінюючи DATA імітуємо зміну положення перемикача.
Програма KEY
Адреса
Машинний код
Мітка
Мнемокод
Коментар
8150
31 0083
KEY
LXI SP,8300
записати в SP адресу 8300
8153
3E E7
WAIT
MVI A,E7 (IN 20)
ввести число з вхідн. пристрою
8155
FE FF
CPI FF
чи є 0-ий розряд
8157
CA 5381
JZ WAIT
якщо ні, то чекати
815A
CD 6081
CALL IDSW
якщо так, викликати п/п визначення 0-го розряду
815D
76
HLT
закінчити роботу
8160
06 FF
IDSW
MVI B,FF
записати в регістр В FF
8162
04
SRCH
INR B
збільшити вміст регістру В на 1
8163
1F
RAR
зсунути число в акумуляторі вправо
8164
DA 6281
JC SRCH
якщо прапорець С=1, то продовжити
8167
С9
RET
повернення з підпрограми
Завдання на лабораторну роботу
1.Дослідити процес виконання команд виклику та повернення з підпрограми, а також команд роботи зі стеком. Для цього: 1)ввести в МП-пристрій нижчеприведену програму EKS; 2)виконати програму EKS в покомандному режимі, перевіряючи після виконання кожної команди вміст відповідних регістрів мікропроцесора; 3)замінити в програмі EKS команду РОР РSW командою NOP (код 00) і прослідкувати виконання програми. Пояснити зміни, що сталися.
Програма EKS
Адреса
Машинний код
Мітка
Мнемокод
Коментар
8200
31 0083
EKS
LXI SP,8300
вказати початок стеку
8203
CD 0782
CALL STDY
викликати підпрограму
8206
76
HLT
припинити виконання програми
8207
F5
STDY
PUSH PSW
записати слово стану в стек
8208
C5
PUSH B
записати вміст рег. пари в стек
8209
D5
PUSH D
записати вміст рег. пари в стек
820A
E5
PUSH H
записати вміст рег. пари в стек
820B
3E 05
MVI A,05
записати в А число 05
820D
47
MOV B,A
переписати число з рег. А в рег. В
820Е
87
ADD A
подвоїти вміст А
820F
5F
MOV E,A
переписати вміст рег. А в рег. Е
8210
67
MOV H,A
переписати вміст рег. А в рег. H
8211
E1
POP H
занести дані з рег. пари HL в стек
8112
D1
POP D
занести дані з рег. пари DE в стек
8113
C1
POP B
занести дані з рег. пари BC в стек
8114
F1
POP PSW
занести слово стану в стек
8115
C9
RET
повернення з підпрограми
2. Розробити підпрограму часової затримки на 5, 10, 15, 20с. Перевірити роботу програми на лабораторному макеті.
Зміст звіту
У звіті повинно бути: 1) скорочений виклад теоретичних положень; 2) повний перелік команд виклику та повернення з підпрограми для мікропроцесора КР580ИК80А; 3) програми та підпрограми, що приведені в інструкції; 4) розроблена в процесі домашньої підготовки одна з програм 5, 10, 15 та 20-секундної затримки; 5) перелік команд мікропроцесора КР580Ик80А, що виконують операції зі стеком; 6) відповіді на питання, що поставлені в п.4 завдання для домашньої підготовки.
Контрольні запитання
1. Вкажіть за скільки машинних циклів виконується команда CALL ADDR.
2. З допомогою яких команд можна задати або перезадати область пам’яті, що відведена під стек?
3. Вкажіть які дії виконуються мікропроцесором по команді RET.
4. В якій послідовності заноситься в стек та виймається зі стеку вміст регістрових пар у підпрограмах?
5. Як буде виконана програма EKS, якщо замість команди POP B буде записана команда NOP?
6. Який мінімальний час затримки може забезпечити підпрограма 1, якщо тривалість такту T=1мкс?
7. Який максимальний час затримки може забезпечити підпрограма 1, якщо тривалість такту T=1мкс?
8. Що таке стек? Його призначення і правила використання.
9. Сформулюйте алгоритм виконання МП КР580ІК80А команд DAA, CALL ADDR і RET.
Література
1. Горбунов В. Л., Панфилов Д. И. Микропроцессоры. Лабораторный практикум. - М.: Высшая школа. - 1984. - с.103.
2. Каган Б. М., Сташин В. В. Основы проектирования микропроцессорных устройств автоматики. - М.: Энергоатомиздат. - 1983. - с.304.
3. Вершинин О. Е. Применение микропроцессоров для автоматизации технологических процессов. - Л.: Энергоатомиздат. - 1986. - с.208.
Навчальне видання
ПІДПРОГРАМА І СТЕК
РОЗРОБЛЕННЯ ПРОСТИХ ПРОГРАМ
Інструкція
до лабораторної роботи № 3
з курсу
"МІКРОПРОЦЕСОРНІ ПРИСТРОЇ"
для студентів базового напряму 6.160100
“Інформаційна безпека”