Правила запису програм на мові Асемблера
Початковий текст програми на мові асемблера має певний формат. Кожна команда (і псевдокоманда) є рядком чотирьохланкової конструкції:
МІТКА->ОПЕРАЦІЯ->ОПЕРАНД(и) ->КОМЕНТАР.
Ланки (поля) можуть відділятися одна від одно довільним числом пропусків. Порядок і позиція полів важливі. Так, мітки повинні починатися в першому стовпці. Операція (мнемоніка команди) може починатися в другому стовпці або поза ним.
Операнди слідують за мнемонікою команди. Коментарі можуть слідувати за операндами, мнемонікою або мітками, і можуть починатися в будь-якому стовпці. Максимальна ширина стовпця – 255 символів. Один або більшу кількість пропусків повинен відокремити мітку і мнемоніку команди, і мнемоніку і операнд(и). Операнди повинні відділятися комою.
Наприклад:
; Приклад фрагмента початкової програми «Ініціалізація МК»
BEGIN
MOVLW INITA
; Завантаження в робочий регістр W значення, привласненого імені INITA (значення ,константа ; або число) повинно бути привласнено раніше в попередніх фрагментах рограми)
MOVWF TRISA
; Завантаження значення з робочого регістра W в регістр управління конфігурацією порту А
MOVLW INITB
; Завантаження в робочий регістр W значення, привласненого імені INITB
MOVWF TRISB
; Завантаження значення з робочого регістра W в регістр управління конфігурацією порту В.
Мітка – у полі мітки розміщується символічне ім’я елементу пам’яті, в якій зберігається відмічена команда або операнд. Мітка є буквено-цифровою комбінацією, що починається з букви. Використовуються тільки букви латинського алфавіту. Асемблер допускає використання в мітках символу підкреслення (_). Довжина мітки може бути від 6 до 32 (наприклад для MPASM) символів. Мітки можуть супроводжуватися двокрапкою (:), пропуском, табуляцією або кінцем рядка. Як символічні імена і мітки не можуть бути використані мнемокоди команд, псевдокоманд і операторів Асемблера, а також мнемонічні позначення регістрів і інших внутрішніх блоків МК.
Операція – у полі операції записується мнемонічне позначення команди МК або псевдокоманди асемблера, яке є скороченням (абревіатурою) повного англійського найменування виконуваної дії. Якщо є мітка на тому ж самому рядку, то мнемоніка команди асемблера, директиви асемблера і макрозвернення повинні відділятися від цієї мітки двокрапкою або одним або великою кількістю пропусків або міток табуляції [4]
Операнди – у цьому полі поміщаються операнди (або операнд), які приймають участь в операції. Операнди повинні відділятися від мнемоніки одним або більше пропусків або міток табуляції. Списки операндів (операнди) повинні відділятися комами. Команди можуть бути без-, одно-, або двооперандними. Операнд може бути заданий безпосередньо або у вигляді його адреси (прямої або непрямої). Безпосередній операнд представляється числом (MOVLW 0FFh, де символ 0 для Асемблера означає, що це число FFh, а не мітка або, MOVLW B’01010011′, де В – позначає двійкове число) або символічним ім’ям (MOVWF DATAPORT).
Використовувані як операнди символічні імена і мітки повинні бути визначені, а числа представлені з вказівкою системи числення, для чого використовується префікс (буква, що стоїть перед числом): В – для двійкової, Q – для вісімкової, D – для десяткової, Н – для шістнадцяткової. Число без префікса за умовчанням вважається десятковим.
Псевдокоманди асемблера – асемблююча програма транслює початкову програму в об‘єктні коди. Хоча транслююча програма бере на себе багато з рутинних завдань програміста, такі як привласнення дійсних адрес, перетворення чисел, привласнення дійсних значень символьним змінним і т.п., програміст все ж таки повинен вказати їй деякі параметри: початкова адреса робочої програми, кінець асембльованої програми, формати даних і т.п. Всю цю інформацію програміст вставляє в початковий текст своєї прикладної програми у вигляді псевдокоманд (директив) асемблера, які тільки управляють процесом трансляції і не перетворяться в коди об‘єктної програми.
Псевдокоманда ORG 100H задає асемблеру адресу елементу пам’яті (100Н), в якій повинна бути розташована наступна за нею команда прикладної програми.
Псевдокомандою EQU можна будь-якому символічному імені, використовуваному в програмі, поставити у відповідність певний операнд. Наприклад, запис TMR0 EQU 01h приводить до того, що в процесі асемблювання усюди, де зустрінеться символічне ім’я TMR0, воно буде замінено числом 1.
Псевдокомандою END програміст дає асемблеру вказівку про закінчення трансляції.
В результаті трансляції повинна бути отримана карта пам’яті програм, де кожному елементу пам’яті поставлений у відповідність код, що зберігається в ньому.
Нижче приведений фрагмент робочої програми, що містить операнди з різним способом завдання і псевдокоманду END:
MOVLW B’01010101′
; Завантажити константу 01010101 у регістр W
MOVLW DATAPORT
; Записати вміст регістра W в регістр DATAPORT (визначений раніше як порт В)
GOTO $
; Безкінцевий цикл (вічний цикл для перевірки програми в динамічному режимі).
END
; Кінець трансляції і закінчення програми
Структура робочої програми
Робоча програма для ОMK PIC 16/18 складається з трьох основних секцій:
1. Секція заголовка.
2. Робоча секція.
3. Секція закінчення.
У секції заголовка визначаються логічні імена для всіх використовуємих в програмі ресурсів: портів, бітових і байтових змінних, регістрів. Це початкова частина початкової програми до рядка з виразом ORG 0 (для PIC 16F877). Для інших типів мікроконтролерів сімейств PIC 16/18 адреса початку наступної секції (сегменту) робочої програми може бути іншою (див. організацію пам’яті програм конкретного типу ОМК).
Робоча секція програми починається з виразу ORG 0 (для PIC16F877), який є покажчиком для Асемблера про те, що код наступний за цим виразом починається з нульової адреси пам’яті програм.