Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичні вказівки до лабораторних робіт.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
464 Кб
Скачать
☆

2. Програмні сегменти

Розглянуті угоди про сегментні регістри змушують нас у такий спосіб будувати програму: в одному сегменті пам'яті треба розмістити всі команди програми й установити регістр CS на початок цього сегмента, в іншому сегменті треба розмістити всі дані програми й на його початок установити регістр DS, а третій сегмент треба відвести під стек і встановити на його початок регістр SS. Але пропозиції нашої програми на мові А розміщає в пам'яті асемблер, а не ми. Як же асемблер визначає, які пропозиції в якому сегменті розміщати? Відповідь такої: він цього не знає, це повинні повідомити йому ми самі. І робиться це так: всі пропозиції, які ми хочемо розмістити в одному сегменті пам'яті, ми зобов'язані в тексті програми об'єднати в так званий програмний сегмент. Це аналог сегмента пам'яті, але в термінах мови А. Програмний сегмент має наступну структуру:

<ім'я сегмента> SEGMENT <параметри> <пропозиція>

<пропозиція> <ім'я сегмента> ENDS

Програмному сегменту дається ім'я, що повинне бути повторене двічі -у директиві SEGMENT, що відкриває сегмент, і в директиві ENDS (end of segment), що закриває його. Між цими директивами може бути зазначене будь-яке число будь-яких пропозицій. Зміст всієї цієї конструкції такий: ми заявляємо асемблеру, що всі пропозиції між директивами SEGMENT і ENDS він повинен розмістити в одному сегменті пам'яті. Але при цьому треба пам'ятати, що розмір сегмента пам'яті не повинен перевищувати 64 Кб, тому зазначених пропозицій повинне бути стільки, щоб у сукупності вони займали не більше 64 Кб, інакше асемблер зафіксує помилку.

Відзначимо, що в програмі може бути кілька сегментів з тим самим ім'ям. Уважається, що це один сегмент, просто він з якоїсь причини описаний вроздріб; всі пропозиції цих частин асемблер з'єднає разом.

Параметри директиви SEGMENT будуть розглянуті пізніше, а поки лише відзначимо, що параметри в основному потрібні тоді, коли програма більша й зберігається в декількох файлах, і параметри вказують, як поєднувати ці файли. Якщо ж програма невелика, уміщається в одному файлі, тоді параметри не потрібні.

Приклад програмних сегментів:

A SEGMENT

Al DB 400h DUP(?)

А2 DH 8

A ENDS

В SEGMENT

B1 DW A2

В2 DD A2

В ENDS

З SEGMENT

ASSUME ES:A, DS:B, CS:C

L: MOV AX,A2

MOV BX,B2

З ENDS

Використовуючи цей приклад, уточнимо деякі речі.

У загальному випадку асемблер розміщає в пам'яті програмні сегменти послідовно один за одним, причому кожний з них він обов'язково розміщає з адреси, кратного 16, - із границі так званого параграфа (параграфом у ПК називають ділянка пам'яті, що починається з адреси, кратного 16, і складається з 16 байтів). Нехай, наприклад, сегмент А розміщений з абсолютної адреси l0000h. Тоді всі пропозиції цього сегмента займуть у пам'яті байти з адресами від l0000h до 10401h. Після цього перший вільний байт буде мати адреса 10402h. Він не кратний 16 (не кінчається на 0) і з його не можна розміщати сегмент В, тому асемблер пропускає цей і наступні байти аж до найближчого байта з адресою, кратною 16. Це адреса 10410h. З його асемблер і почне: розміщення пропозицій сегмента В, зайнявши під них 6 байтів. Сегмент Із буде розміщений з наступної адреси, кратного 16, тобто з 10420h. Таким чином, асемблер сам стежить за тим, щоб сегменти розміщалися в пам'яті з адрес), кратних 16, рятуючи нас від цієї турботи.