- •Тема 2. Архітектура процесора і мова асемблера: Основи програмування на мові асемблера
- •Коментарі у програмах на асемблері
- •Формат кодування
- •Директиви управління лістингом: page и title
- •Директива segment
- •Директива assume
- •Директива визначення байта (db)
- •Директива визначення слова (dw)
- •Директива визначення подвійного слова (dd)
- •Директива визначення четвірного слова (dq)
- •Питання для самоперевірки
Директиви управління лістингом: page и title
Асемблер містить ряд директив, які керують форматом друку (або лістингу). Обидві директиви PAGE і TITLE можна використовувати в будь-якій програмі.
PAGE 60,132 |
Кількість рядків на сторінці може бути в межах від 10 до 255, а символів у рядку - від 60 до 132. За умовчанням в асемблері встановлено: PAGE 66,80.
Припустимо, що лічильник рядків встановлено на 60. У цьому випадку асемблер, роздрукувавши 60 рядків, виконує прогін аркуша на початок наступної сторінки і збільшує номер сторінки на одиницю. Крім того можна змусити асемблер зробити прогін аркуша на конкретному рядку, наприклад, в кінці сегмента. Для цього необхідно записати директиву PAGE без операндів - асемблер автоматично робить прогін аркуша при обробці діpектіви PAGE.
Директива TITLE. Для того, щоб згори кожної сторінки лістингу друкувався заголовок (титул) програми, використовується діpектіва TITLE в такому форматі: TITLE текст.
Рекомендується в якості тексту використовувати ім'я програми, під яким вона знаходиться в каталозі на диску. Наприклад, якщо програма називається ASMSORT, то можна використовувати це ім'я та описовий коментар загальною довжиною до 60 символів:
TITLE ASMSORT — Асемблерна програма сортування імен |
У асемблері також є директива підзаголовка SUBTTL, яка може виявитися корисною для дуже великих програм, що містять багато підпрограм.
Директива segment
ім'я SEGMENT [параметри] ... ... ім'я ENDS |
Ім'я сегмента має бути обов'язково присутнім, бути унікальним і відповідати угодам для імен в асемблері. Директива ENDS означає кінець сегмента. Обидві директиви SEGMENT і ENDS повинні мати однакові імена. Директива SEGMENT може містити три типи параметрів, що визначають вирівнювання, об'єднання (або суміщення) і клас.
Вирівнювання. Цей параметр визначає межу початку сегменту. Звичайним значенням є PARA, за яким сегмент встановлюється на межу параграфа. У цьому випадку початкова адреса ділиться на 16 без залишку, тобто, має шіст. адресу nnn0. У разі відсутності цього операнду асемблер приймає за умовчанням значення PARA.
Об`єднання. Цей елемент визначає, чи об'єднується даний сегмент з іншими сегментами в процесі перегляду після асемблювання. Можливі такі типи об'єднань: STACK, COMMON, PUBLIC, AT и MEMORY.
Сегмент стеку визначається наступним чином: ім'я SEGMENT PARA STACK .
Коли окремо відасембльовані програми повинні об'єднуватися компонувальником, то можна використовувати типи: PUBLIC, COMMON і MEMORY. У випадку, якщо програма не повинна об'єднуватися з іншими програмами, то ця опція може бути опущена.
Клас. Цей елемент, укладений в апострофи, використовується для групування відносних сегментів при компонуванні:
ім'я SEGMENT PARA STACK 'Stack'
ім'я сегменту SEGMENT PARA ім'я процедури PROC FAR коди команд сегменту з однією процедурою ім'я процедури ENDP ім'я сегменту ENDS RET |
Сегмент коду містить виконувані команди програми. Крім того цей сегмент також включає в себе одну або кілька процедур, визначених директивою PROC. Сегмент, який містить лише одну процедуру, має такий вигляд:
Назва процедури має бути обов'язково присутня, бути унікальною і задовольняти угодам про імена в асемблері. Операнд FAR вказує завантажувачу DOS, що початок цієї процедури є точкою входу для виконання програми.
Директива ENDP визначає кінець процедури і має ім'я, аналогічне імені в директиві PROC. Команда RET завершує виконання програми і в даному випадку повертає керування в DOS. Сегмент може містити кілька процедур.