- •Лабораторна робота №1
- •Xor ax, ax
- •Int 21h
- •Зміст звіту
- •2 Короткі теоретичні відомості
- •2.1. Етапи розробки програм мовою асемблер
- •2.2 Формати команд мікропроцесора 8086
- •2.3 Елементи мови асемблера
- •2.4 Формат команд і псевдооператорів мови асемблера
- •2.5 Структура програми
- •2.6 Псевдооператори мови асемблера
- •2.6.1 Опис сегмента
- •2.6.2 Псевдооператори визначення ідентифікаторів
- •2.6.3 Директиви опису даних
- •2.6.4 Оператори
- •2.7 Лістинг програми
- •2.8 Програмні переривання
2.5 Структура програми
У більшості програм, які написані на мові асемблера, можливо виділити основні частини: заголовок, дані, коди програми, закінчення (рис. 2).
Заголовок На початку програми за допомогою псевдооператора Title можна задати ім’я програми, яке буде печататись на кожній сторінці лістингу. Наприклад: Title “Програма 1”. В області заголовка може знаходитися інформація про різновидність асемблера, моделі пам’яті, резервування простору пам’яті для стека інше.
Область даних та тіло програмиОбласть даних та тіло програми можна задати за допомогою директив сегментації. Процесор в режимі і8086 може одночасно працювати з чотирма сегментними регістрами, створюючи відповідні області пам’яті:сегмент коду; сегмент стека; сегмент даних; додатковий сегмент даних. Сегментація може бути пов'язаною з концепцією модульного програмування, уніфікацією оформлення об'єктних модулів, які створюються компілятором, у тому числі з різних мов програмування.
Закінчення Завершує програму на мові асемблера директива END, яка вказує на кінець тексту програми та на мітку, з якої потрібно розпочати виконання програми. Любий текст після закінчення програми ігнорується. Наприклад:
End Start ;кінець програми. Розпочати програму з мітки Start
Рисунок 2 – Структура програми на мові асемблера
2.6 Псевдооператори мови асемблера
2.6.1 Опис сегмента
Основним елементом побудови програми на мові асемблера є сегмент пам’яті, який складається з відкриваючого рядка, тіла сегмента та закриваючого рядка. Відкриваючий рядок містить ім’я сегмента, само слово Segment та додаткові параметри. Закриваючий рядок містить ім’я сегменту та директиву закриття сегменту ENDS. Спрощений синтаксис опису сегмента на асемблері має наступну структуру:
Ім’я_сегмента Segment [тип комбінування] [клас сегмента] [тип розміру сегмента]
Тіло сегменту
Ім’я_сегмента ENDS
Додаткові параметри допомагають прискорити роботу асемблера, але не обов’язкові для використання.
тип комбінування сегментів може бути STACK (визначення сегмента стека) і змушує компоновщик обчислювати адреси в цих сегментах відносно вмісту регістра ss. Якщо не зазначено жодного сегмента стека, компоновщик видасть попередження, що сегмент стека не знайдений.
Функціональне призначення сегментів Директиви сегментації не містять інформації про функціональне призначення сегментів: сегменти коду, даних або стека. Тому транслятору необхідно вказувати про функціональне їх призначення. Для цього використають спеціальну директиву ASSUME, яка повідомляє транслятору про прив'язку сегментів до відповідних сегментних регістрів. Директива ASSUME має наступні формати:
ASSUME nothing та
ASSUME ім’я_сегментного_регістра : ім’я_сегмента, ім’я_сегментного_регістра : ім’я_сегмента, …
Якщо в якості операнда використається тільки ключове слово nothing, то попередні призначення всіх сегментних регістрів анулюються. Якщо ключове слово nothing використовується замість імені сегмента, то у цьому випадку буде розірвано зв'язок між сегментом й відповідним сегментним регістром.