Вивчення мови програмування та програмного забезпечення для мікроконтролерів MCS-51
Вивчення будови і роботи лабораторного стенду EV8031/AVR, його можливостей при використанні для розробки програмного забезпечення для мікроконтролерів MCS-51 і AVR типу. Методи тестування лабораторного стенду. Мова Асемблера для мікроконтролерів MCS-8051.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | украинский |
Дата добавления | 09.02.2011 |
Размер файла | 42,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
ЛАБОРАТОРНА РОБОТА №2
Вивчення мови програмування та програмного забезпечення для мікроконтролерів MCS - 51
Мета роботи: Метою даної роботи є вивчення будови та роботи лабораторного стенду EV8031/AVR, його можливостей при використанні для розробки програмного забезпечення для мікроконтролерів MCS - 51 та AVR типу, тестування лабораторного стенду.
Мова Асемблера для мікроконтролерів MCS - 8051
програмне забезпечення лабораторний мікроконтролер
Для ефективної розробки прикладного програмного забезпечення для мікропроцесорів і мікроконтролерів необхідно вибрати відповідну мову програмування. Якщо потрібна не дуже складна і при цьому швидка і компактна програма, яка не містить складних обчислювальних операцій, то для її написання краще вибрати мову низького рівня (мова асемблера). Мову високого рівня (МВР) краще вибрати в тому випадку, якщо необхідно проводити складні обчислення: операції над 16 - , 32 - розрядними числами, числами з плаваючою крапкою і т.д. Найчастіше найбільш доцільним є використання змішаною моделі, де критичні до швидкодії частини програми написані на асемблері, а обчислювальні процедури реалізовані на МВР, наприклад, на Сі.
Вивчення мов програмування найбільш доцільно починати з асемблера, оскільки він дає наочне уявлення про функціонування апаратної частині мікропроцесора (мікроконтролера), для якого розробляється прикладна програма, що в кінцевому випадку забезпечує отримання оптимальних схемотехнічних рішень для мікропроцесорних систем, що розробляється. Мова асемблера відноситься до групи машинно - орієнтованих мов. Інакше кажучи, кожному типу мікропроцесорів або мікроконтролерів відповідає своя асемблерна мова.
Оператором мови асемблера мікроконтролера 8051 (мови А51) є рядок початкового тексту програми для мікроконтролера, що має такий формат:
<мітка> - <команда/директива> - ;<коментар>
<операція> <операнд>.
Поле команда/директива є головним полем рядка і складається з поля операція і поля операнди, розділених пробілом.
Поле операція містить мнемонічне позначення команди або директиви асемблера, яке є скороченням (абревіатурою) повного англійського найменування дії, що виконується. Наприклад: MOV - move - переслати, JMP - jump - перейти, DB - define byte - визначити байт. Крім того, поле операція може містити символічне ім'я асемблерної макрокоманди.
Поле операнди залежить від поля операція і може вказувати групу розділених комою операндів, або може бути виключене взагалі.
Операнди асемблерних команд визначають тип даних (біт, байт, 2 - байтне слово), що використовуються, спосіб адресації цих даних і адреси переходів в області пам'яті програми мікроконтролера. Розрізняють наступні способи адресації даних: регістрова, пряма, непрямо - регістрова і безпосередня.
Регістрова адресація забезпечує звертання до 1 - байтного вмістимого регістрів А, B або регістрів R0 - R7 вибраного банку, до 2 - байтного вмістимого регістра DPTR і до бітного вмістимого прапорця переносу С, при цьому як операнди використовуються прийняті імена перерахованих програмно доступних елементів, а також символічні імена (тільки для регістрів R0 - R7), що визначаються користувачем.
Пряма адресація використовується для звертання до 1 - байтного вмістимого 128 - ми комірок резидентної (внутрішньої) пам'яті даних (РПД) або 21 - го регістра спеціальних функцій (РСФ), а також до бітового вмістимого 16 - ти комірок РПД або 11 - ти РСФ, що дозволяють побітну адресацію. При прямій адресації даних в полі операнди вказується пряма адреса комірок РПД, що використовуються, регістра спеціальних функцій або біта. Ця адреса може бути задана числом, символічним ім'ям, виразом, ім'ям (тільки для РСФ і бітів РСФ). Крім того, ім'я біта РСФ може бути представлено структурою вигляду: ім'я РСФ.номер біта. Наприклад, ім'я п'ятого біта регістра TCON можна записати як TCON.5, ім'я другого біта акумулятора - як AСС.2 і т.д.
З допомогою непрямо - регістрової адресації забезпечується звертання до 1 - байтного вмістимого 128 - ми комірок РПД, при цьому адреса необхідної комірки, визначається вмістом вказівника стеку SP або одного з регістрів R0, R1 вибраного банку регістрів. Непрямо - регістрова адресація використовується також для звертання до зовнішньої пам'яті даних (ЗПД). В цьому випадку регістром - вказівником може бути 16 - розрядний регістр - вказівник даних DPTR або один із згаданих вище регістрів R0, R1. Для роботи з даними, що зберігаються у вигляді констант в пам'яті програм мікроконтролера, використовується непрямо - регістрова адресація як сума базового регістру (вмістиме регістру - вказівника DPTR або регістру програмного лічильника PC) та індексного регістру (вмістиме акумулятора А). Будь - яка така константа може бути вибрана за адресою, яка обчислюється додаванням вмістимого DPTR (PC) з вмістимим А. Операнд, що визначає непрямо - регістрову адресацію даних, задається ім'ям регістра - покажчика або символічним ім'ям (тільки для R0 і R1) з обов'язковим префіксом @.
При безпосередній адресації дані, призначені для обробки, безпосередньо задаються в полі операнди і можуть бути представлені в ньому числом, символічним ім'ям або виразом з обов'язковим префіксом #.
Аналогічним чином (за винятком префікса #) представляється операнд, що визначає адресу переходу в пам'яті програм мікроконтролера.
Як операнди асемблерних директив і макрокоманд в основному використовуються числа, символічні імена, вирази, імена програмно доступних елементів мікроконтролера (тільки для директиви REG і макрокоманд), а у ряді випадків мнемоніки мови А51 (тільки для макрокоманд).
Символічні імена, що є операндами команд або директив, повинні бути обов'язково визначені за допомогою відповідних директив (EQU, VAR або REG) мови А51. Крім цього, символічне ім'я адреси в пам'яті програм може бути визначено використанням цього імені в полі мітка одного з рядків вихідного тексту програми. Відзначимо, що коректне символічне ім'я повинне бути представлено комбінацією букв латинського алфавіту і цифр і починатися з букви, при цьому вказана комбінація допускає використання символу підкреслення.
Числа, що задаються як операнди, приводяться з завданням системи числення (СЧ), для чого використовується суфікс (латинська буква, що стоїть після числа): B - для двійкової СЧ, Q - для вісімкової СЧ, D - і H - відповідно для десяткової і шістнадцяткової СЧ. Число без суфікса вважається десятковим.
Вираз, що використовується в полі операнди, обчислюється в процесі трансляції вихідної мікроконтролерної програми і є сукупністю символічних імен і (або) чисел (у форматі 2 - байтних слів).
Поле мітка не є обов'язковим, відділяється від поля команда/директива пробілом і може містити символічне ім'я, що утворюється з букв та цифр і закінчується двокрапкою. Мітка може бути розташована в будь - якому місці рядка.
Поле коментар містить різноманітні пояснення: може пояснювати використання тієї або іншої команди або директиви, містити опис алгоритму ділянки або програми в цілому та ін. Це поле не є обов'язковим і при використанні повинно починатися символом ;.
Вирази мови Асемблер
Вираз - це конструкція мови, що використовується для обчислення чисельного значення на етапі трансляції вихідної програми. Елементами виразів є круглі дужки, знаки операцій, імена операцій, терми. Круглі дужки визначають порядок обчислення операцій в виразі. В якості знаків операцій в виразах використовуються наступні символи: “*”, “+”, “ - ”, “/”. В якості імен операцій в виразах використовуються такі ключові слова: MOD, SHR, SHL, EQ, NE, LT, GT, GE, NOT, AND, OR, XOR, HIGH, LOW.
Терм - це найменша частина виразу, яка не ділиться і представляє собою чисельне значення на етапі трансляції з мови Асемблера. Значення терму в мові абсолютне і представляється цілим числом, величина якого в загальному випадку знаходиться в межах від 0 до 65535. В мові Асемблера розрізняють такі види термів: “число”, “символьна стрічка”, “ім'я мітки”, “позначення лічильника адресу”, “ ім'я - синонім виразу”.
Діапазон зміни значення терму “число” знаходиться в межах від 0 до 65535. Приклади терму “число”:
Терм - Значення терму
101В - 0005H
1777Q - 03FFH
65535 - FFFFH
65536 - 0000H
183H - 0183H
Терм “символьна стрічка” складається з одного або двох значущих символів. Величина значення терму визначається наступним чином. Якщо даний терм складається з одного символу, то код цього символу утворює молодший байт значення терму. Старший байт значення терму встановлюється рівним 00Н. Якщо даний терм складається з двох символів, то код першого символу утворює старший байт значення терму, а код другого - молодший байт значення терму:
Терм - Значення терму
`AB' - 4142H
`*' - 002AH
`_1' - 2031H
Терм “ім'я мітки” - це посилання на мітку, представлене її іменем. Визначення даного терму здійснюється шляхом запису ідентифікатора в поле мітки певної стрічки програми. Значенням терму є адрес команди або даних (в пам'яті команд), що ідентифікуються цією міткою. Таким чином діапазон зміни значень терму знаходиться в межах від 0 до 65535. Приклад визначення і використання терму “ім'я мітки”:
Lab1: - MOV - A, - P2
ANL - A, - #01010101B
JZ - Lab1
Терм “позначення лічильника адресу” - це символ “знак грошової одиниці” ($). Значення терму встановлюється рівним вмістимому лічильника адресу програми на момент її трансляції. Діапазон зміни значень терму знаходиться в межах від 0 до 65535. Приклад використання терму “позначення лічильника адресу”:
JMP - $+10H
Терм “ім'я - синонім виразу” - це ідентифікатор, який визначений директивою EQU або SET в якості імені - синоніму для виразу. Значення терму встановлюється рівним значенню ідентифікатора. Приклад використання терму “ім'я - синонім виразу”:
Data_Val1 - EQU - (124+32H*5) - Mod - 5
MOV - A, - #Data_Val1
Операції в виразах. Операції в виразах - це конструкція мови, що використовується для завдання дій, які виконуються асемблером в процесі обчислення виразу з одним або двома операндами. В мові Асемблера є такі типи операцій в виразах: арифметичні, логічні, зсуву, відношення, виділення байтів.
Арифметичні операції виконуються над операндами в доповнюючому коді по модулю . Діапазон зміни результату в загальному випадку знаходиться в межах від 0 до 65535. В мові Асемблера є наступні арифметичні операції: додавання, віднімання, множення, ділення і обчислення остачі.
Операція додавання може бути з одним доданком або з двома доданками. Операція додавання з одним доданком має вигляд +(X). В цьому випадку при виконанні операції додавання в суму заноситься вираз, рівний значенню операнда (X) без змін. Операція додавання з двома доданками має вигляд (X) + (Y). В даному випадку в суму заноситься результат, рівний сумі значень операндів (X) і (Y). Приклади операції додавання:
Операція - Результат операції
5+10Н - 0015H
65535+5 - 0004H
Операція віднімання може бути одномісною або двомісною. Одномісна операція віднімання має вигляд: - (X). Дана операція заносить в вираз результат, рівний доповнюючому коду значення операнда (X). Двомісна операція віднімання має вигляд: (X) - (Y). Дана операція заносить в вираз результат, рівний різниці значень операндів (X) і (Y). Від'ємний результат заноситься в доповнюю чому коді. Приклад операції віднімання:
Операція - Результат операції
FFFFН - 0001H
2 - FFFEH
65535 - 1 - FFFEH
1 - 2 - FFFFH
Операція множення має наступний вигляд: (X)*(Y). Дана операція заносить в вираз результат, рівний добутку значень операндів (X) і (Y). Приклади операцій множення:
Операція - Результат операції
7*5 - 0023H
65535*2 - FFFEH
Операція ділення має наступний вигляд: (X)/(Y). Дана операція заносить в вираз результат, рівний цілій частині частки. Значення операнду (Y) не може бути рівним нулю. Приклади операцій ділення:
Операція - Результат операції
2/5 - 0000H
240/7 - 0022H
Операція обчислення остачі має вигляд: (X) Mod (Y). Дана операція заносить в вираз результат, рівний остачі від ділення значення операнду (X) на значення операнду (Y). Значення операнду (Y) не може бути рівним нулю. Приклади операції обчислення остачі:
Операція - Результат операції
2 Mod 3 - 0002H
7 Mod 3 - 0001H
Операція зсуву. В мові Асемблера є операції зсуву вліво і зсуву вправо. Операція зсуву вліво має вигляд: (X) SHL (Y). Дана операція заносить в вираз результат, рівний значенню операнда (X), зсунутому вліво на число двійкових розрядів, рівне значенню операнду (Y). Біти, що зсуваються з старшого розряду, втрачаються. Молодші розряди, що звільняються при цьому, встановлюються в нульовий стан. Приклад операції зсуву вправо:
Операція - Результат операції
000FH SHL 2 - 003CH
8001H SHL 1 - 0002H
Операція зсуву вправо має вигляд: (X) SHR (Y). Дана операція заносить в вираз результат, рівний значенню операнда (X), зсунутому вправо на число двійкових розрядів, рівне значенню операнду (Y). Біти, що зсуваються з молодшого розряду, втрачаються. Старші розряди, що звільняються при цьому, приймають нульові значення. Приклад операції зсуву вправо:
Операція - Результат операції
0F0AH SHR 4 - 00F0H
000FH SHR 0 - 000FH
В мові Асемблера є чотири логічні операції: додавання, додавання по модулю 2, множення і інверсія. Операція логічного додавання має вигляд: (X) OR (Y). Дана операція заносить в вираз результат, рівний порозрядній логічній сумі значень операндів (X) і (Y). Приклади операцій логічного додавання:
Операція - Результат операції
0F00H OR 4 - 0F0FH
0003H OR 5 - 0007H
Операція додавання по модулю 2 має вигляд: (X) XOR (Y). Дана операція заносить в вираз результат, рівний порозрядній сумі по модулю 2 значень операндів (X) і (Y). Приклади операції додавання по модулю 2:
Операція - Результат операції
000FH XOR 0001H - 000EH
0FFFH XOR 00FFH - FF00H
Операція логічного множення має вигляд: (X) AND (Y). Дана операція заносить в вираз результат, рівний порозрядному логічному добутку операндів (X) і (Y). Приклади операції логічного множення:
Операція - Результат операції
ABCDH AND 00FFH - 00CDH
0003H AND 0005H - 0001H
Операція логічної інверсії має вигляд: NOT (X). Дана операція заносить в вираз результат, рівний порозрядній логічній інверсії значення операнду (X). Приклади операції логічної інверсії:
Операція - Результат операції
NOT - 65535 - 0000H
NOT - 2 - FFFDH
Операції відношення. В мові Асемблера є шість операцій відношення: EQ (=), LT (<), LE (<=), GT (>), GE (=>). Операції відношення в загальному випадку мають вигляд: (X) OP (Y). Дана операція заносить в вираз результат, рівний числу FFFFH, якщо відношення значень операндів (X) і (Y), встановлене іменем операції, правдиве, або рівне числу 0000H, якщо відношення значень операндів не правдиве. Приклади операцій відношення:
Операція - Результат операції
1 EQ 0 - 0000H
100 EQ 64H - FFFFH
Операції виділення байтів. В мові Асемблера є операції виділення старшого і молодшого байт. Операція виділення старшого байту має вигляд: HIGH(X). Дана операція заносить в вираз результат, рівний старшому байту значення операнда (X). Приклади операцій виділення старшого байту:
Операція - Результат операції
HIGH (0FF00H) - 00FFH
HIGH (1234H) - 0012H
Операція виділення молодшого байту має вигляд: LOW(X). Дана операція заносить в вираз результат, рівний молодшому байту значення операнда (X). Приклад операції виділення молодшого байта:
Операція - Результат операції
LOW (0FF00H) - 0000H
LOW (1234H) - 0034H
Операції в виразі виконуються зліва на право у відповідності з їх пріоритетом і правилом круглих дужок. Спочатку виконуються операції з високим рівнем пріоритету:
Пріоритет - Ім'я або знак операції
7 - High, Low
6 - *, /, MOD, SHR, SHL
5 - +, - , *, /
4 - LT, LE, GT, GE, EQ, NE
3 - NOT
2 - AND
1 - OR, XOR
Оператор з більш високим рівнем пріоритету виконується в першу чергу. Якщо у виразі присутні оператори з однаковим рівнем пріоритету, то обчислення проводяться зліва направо. Щоб змінити вказаний порядок виконання розрахунків допускається використання дужок. Наведемо як приклад вираз NOT(13H)+1, що реалізує процедуру перетворення числа 13H в доповнюючий код і еквівалентний числу 0EDH, яке буде отримане при трансляції вихідної програми.
Директиви Асемблера
Асемблер транслює вихідну програму в об'єктні коди. Хоча він і бере на себе багато з рутинних задач програміста, таких як присвоєння дійсних адрес, перетворення чисел, присвоєння дійсних значень символьним змінним і т.д., програміст все ж таки повинен вказати програмі деякі параметри: початкову адресу прикладної програми, кінець програми, формати даних і т.д. Всю цю інформацію програміст вставляє в початковий текст прикладної програми у вигляді директив, які тільки керують процесом трансляції і не перетворюються в коди об'єктної програми.
Асемблер підтримує ряд директив, які дозволяють дати символічне визначення змінним, резервують і ініціалізують простір пам'яті, визначають розміщення об'єктного коду, що згенерується, в пам'яті. За винятком DB і DW директиви не утворюють об'єктний код. Директиви використовуються, щоб змінити стан асемблера, визначити об'єкти і додати інформацію до об'єктного файлу.
Директиви асемблера можуть бути розділені на ряд категорій:
символічне визначення,
резервування простору пам'яті,
ініціалізація даних,
керування станом Асемблера,
вибір сегментів,
визначення макрокоманд.
Директиви символічних визначень. Використовуються для того, щоб резервувати простір пам'яті, поставити у відповідність символічним іменам визначені числові значення, регістри мікроконтролера та сегменти. Ці директиви вимагають, щоб ім'я символу було визначено поряд з адресом, чисельним значенням, регістром або типом сегменту. Перелік директив символічних визначень приведений нижче.
Директива |
Опис |
|
BIT |
Визначає символічне ім'я, що посилається на адрес біту |
|
CODE |
Визначає символічне ім'я, що посилається на адрес коду |
|
DATA |
Визначає символічне ім'я, що посилається на адрес РПД |
|
EQU |
Визначає символічному імені числове значення або ім'я регістру |
|
IDATA |
Визначає символічне ім'я, яке посилається на адрес ЗПД |
|
SEGMENT |
Визначає ім'я сегменту, що переміщається, його тип та розміщення |
|
SET |
Призначає символічне ім'я чисельному значенню або регістру. Ім'я потім може бути змінене з допомогою директиви SET |
|
XDATA |
Визначає символічне ім'я, що посилається на адрес ЗПД |
Формат директиви SET: symbol BIT bit - address,
де - symbol - символічне ім'я,
bit - address - адрес біту в РПД.
Символічні імена, визначені директивою BIT, не можуть бути змінені або перевизначені. Наприклад:
Znak_FLAG - BIT - 60H - ; абсолютний біт
Alarm_FLAG - BIT - 20H.0 - ; абсолютний біт
SHUT - BIT - Alarm_Flag+1 - ; наступний біт
Формат директиви CODE: symbol CODE word - address,
де - symbol - символічне ім'я,
word - address - 2 - х байтний адрес в програмній пам'яті.
Символічні імена, визначені директивою CODE, не можуть бути змінені або перевизначені. Наприклад:
Tabl_1 - CODE - 0200H - ; абсолютний адрес коду (ПП) для Tabl_1
Tabl_2 - CODE - 0280H - ; абсолютний адрес коду (ПП) для Tabl_2
Const - CODE - Tabl_2 - ; наступний адрес коду (ПП) для Const
Формат директиви DATA: symbol DATA byte - address,
де - symbol - символічне ім'я, яке може використовуватися в усій програмі;
byte - address - адрес РПД, повинен знаходитись в діапазоні від
0 до 255.
Символічні імена, визначені директивою DATA, не можуть бути змінені або перевизначені. Наприклад:
ADD1 - DATA - 30H - ;
ADD2 - DATA - 40H - ;
SUMMA - DATA - ADD2 + 8 - ;
PORT1 - DATA - 90H - ;
Формат директиви EQU: symbol EQU expression або symbol EQU register,
де - symbol - символічне ім'я, яке заміняється на вираз або регістр в усій асемблерній програмі;
expression - чисельний вираз, що не містить форвардних посилань;
register - одне з таких імен регістрів: A, R0, … R7.
Символічні імена, визначені директивою, можуть використовуватися в операндах, виразах або адресах. Символи, які визначені як ім'я регістра, можуть використовуватися в усіх командах, що працюють з регістрами. Символічні імена, визначені директивою, не можуть бути змінені або перевизначені. Наприклад:
ACCUM - EQU - A - ;
COUNT - EQU - R5 - ;
SERIAL - EQU - SBUF - ;
LIM_Data - EQU - 1200 - ;
VAL_Data - EQU - LIM_Data - 20+'A' - ;
Формат директиви SEGMENT: segment SEGMENT segtype reloctype,
де - segment - символічне ім'я, яке присвоюється сегменту;
segtype - тип сегменту, що визначає адресний простір сегменту (додаткова інформація приведена в таблиці);
reloctype - тип переміщення для сегмента, який визначає пара - метри переміщення для компановщика L51.
Директива SEGMENT використовується для того, щоб описати сегмент, що переміщається. Ім'я кожного сегменту всередині модуля повинно бути єдиним. Але L51 об'єднує сегменти однакового типу. Об'єднання також можливе і з сегментами, описаними в інших вихідних модулях. Змінна segtype визначає адресний простір для сегменту і може бути будь - якою з наступних:
BIT - бітовий адресний простір (простір внутрішньої пам'яті даних з адресами від 20H по 2FH).
CODE - простір програмного коду.
DATA - простір внутрішньої пам'яті даних (адреси з 00H по 7FH).
IDATA - простір з непрямою адресацією внутрішньої пам'яті даних (адреси з 00H по 7FH або з 00H по FFH).
XDATA - простір зовнішньої пам'яті даних.
Необов'язковий параметр reloctype визначає дії компановщика L51:
BITADDRESSABLE - визначає сегмент, який буде переміщений компановщиком L51 всередину області пам'яті даних з бітовою адресацією. Дозволений тільки для сегментів DATA, які по довжині не перевищують 16 байт.
INBLOCK - визначає сегмент, який повинен міститися в 2048 - байтному блоці. Цей тип допустимий тільки для сегментів CODE.
INPAGE - визначає сегмент, який повинен міститися в 256 - байтному блоці. Цей тип налаштування допустимий тільки для сегментів CODE і XDATA.
OVERLAYABLE - визначає, що сегмент може використовувати пам'ять разом з іншими сегментами цього ж типу. При використанні цього типу налаштування ім'я сегменту повинно бути оголошено згідно правил C51 або PL/M51.
PAGE - визначає сегмент, початковий адрес якого повинен бути в 256 - байтному блоці. Розміщення сегменту виконується компановщиком L51. Цей тип налаштування можливий тільки для сегментів CODE і XDATA.
UNIT - цей тип розміщення заданий по замовчуванні як стандартний тип. Він визначає сегмент, який починається в границі модуля. Модуль - байт для сегментів CODE, DATA, IDATA, XDATA і модуль - біт для сегменту BIT.
Приклад:
STACK - SEGMENT - IDATA
RSEG - STACK - ;вибір сегменту
DS - 10H - ;резервуварння 16 байт
MOV - SP, #STACK-1 - ;ініціалізація SP
Формат директиви SET: symbol SET expression або symbol SET register,
де - symbol - символічне ім'я, яке заміняється на вираз або регістр в усій програмі;
expression - чисельний вираз, що не містить форвардних посилань;
register - одне з таких імен регістрів: A, R0, … R7.
Символічні імена, визначені директивою, можуть використовуватися в операндах, виразах або адресах. Символи, які визначені як ім'я регістра, можуть використовуватися в усіх командах, що працюють з регістрами. Символічні імена, визначені директивою, не можуть бути змінені наступними директивами SET. Наприклад:
VAL_1 - SET - 100 - ;
VAL_2 - SET - VAL_1/2 - ;
COUNTER - SET - R1 - ;
TEMP_1 - SET - COUNTER - ;
TEMP_2 - SET - VAL_1*VAL_2 - ;
Формат директиви XDATA: symbol XDATA address,
де - symbol - символічне ім'я, яке може використовуватися в усій програмі;
address - адрес ЗПД, який повинен знаходитися в діапазоні від 0 до 65535.
Символічні імена, визначені цією директивою, не можуть бути змінені або перевизначені. Наприклад:
TIME - XDATA - 0100H - ;
DAT_Var - XDATA - TIME+6 - ;
Директиви резервування та ініціалізації пам'яті. Ці директиви використовуються для резервування та ініціалізації слів, байт або бітів. В абсолютному сегменті зарезервований простір починається з біжучого адресу. В сегменті, що переміщається, зарезервований простір починається тільки з біжучого зміщення. Вказівник розміщення підтримується окремо для кожного сегмента і до нього можна звертатися, використовуючи символ ($).
Директива |
Опис |
|
DB |
Заносить в програмну пам'ять байтову константу. |
|
DBIT |
Резервує простір в бітовому сегменті. |
|
DS |
Резервує простір пам'яті в біжучому сегменті. |
|
DW |
Ініціалізує пам'ять значенням слова. |
Формат директиви DB: label: DB expression , expression,
де - label: - мітка, адрес пам'яті, що ініціалізується;
expression: - значення байта, яке може бути символом, символьною стрічкою або виразом.
Директива DB може бути визначена тільки всередині сегменту коду. Якщо директива використовується в іншому сегменті, асемблер А51 генерує повідомлення про помилку. Наприклад:
REQUEST: - DB - 'PRESS ANY KEY TO CONTINUE' - ;
TABLE: - DB - 0, 1, 8, 'A', '0', Low(TABLE), ';' - ;
ZERO: - DB - 0, '''' - ;
CASE_TAB: - DB - Low(REQUEST), Low(TABLE), Low(ZERO) - .
Формат директиви DS: label: DS expression,
де - label: - мітка, що присвоюється адресу зарезервованої пам'яті;
expression: - кількість зарезервованих байт, не може містити форвардні посилання, символи, що переміщаються або зовнішні символи.
Директива DS резервує певне число байт в резидентній пам'яті даних, зовнішній пам'яті даних або адресному просторі коду програми. Директива резервує простір в біжучому сегменті по біжучому адресу. Потім біжучий адрес збільшується на значення виразу. Сума лічильника адресу і значення виразу не може перевищувати межу біжучого адресного простору.
A51 - асемблер з двома проходами по вихідному тексту програми. При першому проході обробляються символи і визначається довжина кожної команди. При другому проході обробляються форвардні посилання і генерується об'єктний код. Із цих причин вираз, що використовується в директиві, не може містити форвардні посилання. Наприклад:
GAP: - DS - (($ + 16) AND 0FFF0H) - $ - ;
DS - 20 - ;
TIME: - DS - 8.
Формат директиви DW: label: DW expression, expression
де - label: - мітка, що присвоюється адресу зарезервованої пам'яті;
expression: - вирази, дані, які можуть містити символ, символьну стрічку, вираз.
Директива DW може бути визначена тільки всередині сегменту коду програми (програмної пам'яті). Якщо директива використовується в іншому сегменті, асемблер A51 генерує повідомлення про помилку. Наприклад:
TABLE: - DW - TABLE, TABLE + 10, ZERO
ZERO: - DW - 0
CASE_TAB: - DW - CASE0, CASE1, CASE2, CASE3, CASE4
DW - $
Директиви компоновки програми. Ці директиви використовуються для того, щоб дати ім'я об'єктному модулю і визначити спільні та зовнішні символи. В L51 ці директиви використовуються для об'єднання окремих об'єктних модулів в єдиний абсолютний об'єктний модуль.
Директива |
Опис |
|
EXTRN |
Визначає символічні імена, які оголошені в інших об'єктних модулях. |
|
NAME |
Визначає ім'я об'єктного модуля. |
|
PUBLIC |
Визначає символічні імена, які можуть використовуватись в інших об'єктних модулях. |
Директиви керування станом програми. Ці директиви використовуються для того, щоб повідомити про кінець трансляції програми, вибрати початковий адрес або зміщення для сегмента, визначити банк регістрів , що використовується.
Директива |
Опис |
|
END |
Повідомляє про кінець модуля, що компілюється. |
|
ORG |
Змінює значення лічильника адреса біжучого сегмента програми. |
|
USING |
Вибирає номер банку регістрів загального призначення. |
Директива END повідомляє про кінець асемблерного модуля. Будь - який текст в асемблерному файлі, який буде знаходитись після цієї директиви, ігнорується. Директива необхідна в кожному вихідному асемблерному файлі. Якщо директива відсутня, то асемблер генерує повідомлення про помилку. Наприклад:
END
Формат директиви ORG: ORG expression,
де - expression: - повинен бути абсолютним або простим виразом, що переміщається і не може мати форвардних посилань. Символи, що використовуються в виразі, можуть посилатися тільки на біжучий або абсолютний сегменти.
Коли асемблер зустрічає дану директиву, він обчислює значення виразу і змінює лічильник адресів (внутрішня змінна асемблера) для біжучого сегмента. Якщо директива знаходиться в абсолютному сегменті, лічильнику назначається значення дійсного адреса. Якщо директива знаходиться в сегменті, що переміщається, лічильнику назначається зміщення, що визначається виразом. Директива змінює лічильник адресів, але не виробляє новий сегмент. Невикористаний діапазон адресів можна включити в біжучий сегмент. Наприклад:
ORG - 100H
ORG - RESTART
ORG - ($+16) AND 0FFF0H
Директиви вибору сегменту. Ці директиви визначають сегменти даних та коду.
Директива |
Опис |
|
BSEG |
Вибирає абсолютний бітовий сегмент. |
|
CSEG |
Вибирає сегмент програми в машинному коді (програмна пам'ять). |
|
DSEG |
Вибирає абсолютний сегмент внутрішньої пам'яті даних. |
|
ISEG |
Визначає абсолютний непрямо адресований сегмент внутрішньої пам'яті даних |
|
RSEG |
Визначає попередньо визначений сегмент, що переміщається. |
|
XSEG |
Вибирає абсолютний сегмент зовнішньої пам'яті даних. |
Директиви макровизначень. Ці директиви використовуються для визначення макрокоманд.
Директива |
Опис |
|
ENDM |
Закінчує макровизначення. |
|
EXITM |
Виконує негайне закінчення макророзширення. |
|
IRP |
Визначає список аргументів. |
|
IRPC |
Визначає аргумент. |
|
LOCAL |
Визначає до 16 локальних символів, що використовуються всередині макрокоманди.. |
|
MACRO |
Початок макровизначення, визначає ім'я макрокоманди і параметрів, які можуть передаватися макрокоманді. |
|
REPT |
Визначає кількість повторень попередніх рядків. |
Процедури і підпрограми
При розробці мікропроцесорних (мікроконтролерних) систем можна використати два способи організації прикладних програм: монолітний і модульний. При першому способі вся прикладна програма розробляється як єдине ціле. При другому вона будується з окремих програмних блоків, кожний з яких реалізує деяку процедуру обробки даних або керування. Взаємозв'язок блоків визначається розробником при монтажі з цих блоків закінченої прикладної програми.
Окремі фрагменти прикладної програми можуть бути отриманий у вигляді лінійної послідовності блоків, інші (ті, що використовуються багато раз) звичайно оформляються у вигляді підпрограм, до яких прикладна програма, що називається основною, має можливість звертатися по мірі необхідності. Підпрограма повинна мати наступні властивості: виконувати закінчену процедуру обробки даних, мати тільки один вхід і один вихід і не володіти ефектом післядії, при якій біжуче виконання підпрограми впливало би на її подальші виконання.
Виклик підпрограми
Звернення до підпрограми здійснюється по команді виклику CALL MARK, де MARK - символічне ім'я процедури. Ім'я процедури використовується як мітка, що відзначає одну з команд (частіше всього першу) підпрограми. Для Intel 8051 мнемонічне значення CALL є узагальненим і транслюється в одну з команд ACALL або LCALL залежно від адресної відстані підпрограми, що викликається.
По команді CALL в стеку зберігається значення лічильника команд, і повернення з підпрограми здійснюється в те місце основної програми, звідки був здійснений виклик (до команди основної програми, що слідує за командою CALL). Для цього будь - яка підпрограма повинна закінчуватися командою повернення RET, що здійснює відновлення вмісту програмного лічильника із стека.
Достатньо часто виникає необхідність такої організації обчислювального процесу, при якій підпрограма викликає іншу підпрограму, та у свою чергу викликає наступну і т.д. Цей процес називається вкладенням підпрограм. Число підпрограм, які можуть бути викликаний таким чином (глибина вкладеності підпрограм), обмежується тільки ємністю стеку.
Зберігання параметрів основної програми
Іноді при зверненні до підпрограми виникає необхідність зберегти не тільки адресу повернення в основну програму, але і вмістиме окремих робочих регістрів. Зручним способом для цього є перемикання банку регістрів. Наприклад, якщо основна програма використовує 0 - й банк регістрів, то підпрограма може використовувати 1 - й банк регістрів. Проте перемикання банку регістрів не забезпечує збереження вмістимого акумулятора, що приводить до необхідності створювати в одному з робочих регістрів або в пам'яті копію акумулятора.
Передача параметрів
Для успішної роботи будь - якої підпрограми необхідно однозначно визначити спосіб передачі в неї початкових даних і спосіб виводу результату її роботи. Підпрограма, якій потрібна додаткова інформація у вигляді параметрів її налаштування або операндів, називається тією, що параметризується.
Отримали поширення чотири способи передачі параметрів: через пам'ять, через регістри загального призначення, через регістр ознак і через стек.
При передачі вхідних параметрів через пам'ять головна програма обов'язково містить команди завантаження деяких комірок пам'яті, а підпрограма - команди зчитування з цих комірок. При передачі вхідних параметрів підпрограма повинна завантажити деякі елементи пам'яті, а головна програма - зчитати.
Передача параметрів через регістри здійснюється аналогічним чином.
Третій спосіб передачі параметрів - через регістр ознак - зручно використовувати при передачі вихідних параметрів (наприклад, в підпрограмах порівняння чисел). В цьому випадку підпрограма повинна встановити (або скинути) відповідні ознаки, а головна програма - проаналізувати їх значення. Intel 8051 володіє великими можливостями для передачі параметрів через ознаки. В ньому є 128 прапорів користувача, доступних для модифікації і аналізу.
Спосіб передачі через стек дозволяє використовувати як параметр вмістиме лічильника команд.
Використання процедур, оформлених у вигляді підпрограм, при розробці програмного забезпечення має ряд переваг. Перш за все відносно прості модулі, виділені з складної програми, можуть програмуватися декількома розробниками з метою скорочення часу проектування. Ще більш важливим є те, що будь - яка підпрограма допускає автономну відладку. Це, як правило, в багато разів скорочує час відладки всього прикладного програмного забезпечення. І, нарешті, використання підпрограм зменшує довжину прикладної програми, що призводить до зменшення необхідної ємності програмної пам'яті.
Істотним є і те, що відлагоджені процедури організовуються розробниками в бібліотеки підпрограм, що параметризуються, і можуть бути багато разів використані при написані програм. Бібліотека підпрограм повинна будуватися на основі домовленості про єдиний спосіб обміну параметрами.
Размещено на Allbest.ru
Подобные документы
Огляд засобів створення програмного забезпечення сучасних мікроконтролерів. Аналіз методів та налаштувань контролерів. Засоби генерації коду налаштувань. Детальний опис розробки програми генератора налаштувань ядра Cortex M4 та методики її тестування.
курсовая работа [1,3 M], добавлен 20.05.2015Короткий опис мікроконтролера ATmega6450, його особливості та опис виводів. Розробка принципової схеми стенду. Написання програми на мові СІ при використанні програмного середовища CodeVisionAVR. Перепрограмування мікроконтролера ATmega6450 сімейства AVR.
курсовая работа [491,2 K], добавлен 15.05.2013Переваги використання відкритої архітектури програмного забезпечення ВВК. Концепція побудови лабораторного практикуму. Структура та взаємодія програмних та апаратних засобів. Структурна схема розподілу ресурсів мікроконтролера між приладами.
реферат [1,9 M], добавлен 06.07.2009Вивчення архітектури, методів тактування, режимів зниженого енергоспоживання сучасних мікроконтролерів. Організація та режим роботи послідовних периферійних інтерфейсів. Розгляд функціонального призначенням програмного забезпечення Monitor для УНМС-2.
отчет по практике [933,6 K], добавлен 15.02.2010Проблеми розробки компонентного програмного забезпечення автоматизованих систем управління. Сучасні компонентні технології обробки інформації. Аналіз вибраного середовища проектування програмного забезпечення: мова програмування PHP та Apache HTTP-сервер.
дипломная работа [2,8 M], добавлен 11.05.2012Аналіз особливостей мови програмування Java та середовища Android Studio. Розробка програмного забезпечення для якісного та ефективного вивчення іноземних слів. Побудова базових алгоритмів і структури даних. Вибір мови програмування, реалізація програми.
курсовая работа [335,3 K], добавлен 11.01.2015Тестування програмного забезпечення як процес його дослідження для отримання інформації про якість. Автоматизація тестування програми Join It - Jigsaw Puzzle. Методика тестування, структура пакету та його модулів. Вимоги до програмного забезпечення.
дипломная работа [2,4 M], добавлен 24.07.2013Класифікація об'єктно-орієнтованих мов програмування. Розробка алгоритмічного та програмного забезпечення комп'ютерної системи управління процесом випалювання будівельних матеріалів. Тестування програмного забезпечення, оцінка його ефективності.
курсовая работа [1,6 M], добавлен 25.04.2015Розробка програмного забезпечення віртуального вимірювального комплексу, який містить логічний аналізатор та генератор слів. Інтерфейс користувача з можливістю налагодження швидкості, вводу та відображення данних, керування режимами циклічної генерації.
дипломная работа [2,0 M], добавлен 07.07.2009Дослідження алгоритму роботи та коду програми. Оцінка методом "чорного ящика". Тестування і налагодження розробленої програми на алгоритмічній мові високого рівня. Оцінювання якості програмного забезпечення за об’єктно-орієнтованими метриками зв’язності.
курсовая работа [143,1 K], добавлен 11.03.2021