Вивчення мови програмування та програмного забезпечення для мікроконтролерів 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


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.