Директиви сегментації. Директиви proc і endp 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Директиви сегментації. Директиви proc і endp



Директива segment – сегментація тісно пов’язана з концепцією модульного програмування, а також з уніфікацією оформлення об’єктних модулів. Це дозволяє об’єднувати програми, написані різними мовами програмування. Для реалізації різних варіантів такого об’єднання призначені операнди директиви segment. Загальний вигляд цієї директиви

ім’я-сегмента segment [тип-вирівнювання] [тип-комбінування] [клас-сегмента] [тип-розміру-сегмента]

· тип-вирівнювання – задає інформацію для редактора зв’язків про необхідність вирівнювання початку сегмента на задану межу, параметр необов’язковий і може набувати наступних значень:

byte – початкова адреса сегмента будь-яка (вирівнювання немає);

word – початкова адреса сегмента вирівнюється на межу слова (кратна двом);

dword – початкова адреса сегмента вирівнюється на межу подвійного слова (кратна чотирьом);

para – сегмент повинен починатися з адреси, кратної 16 (вирівнювання межі параграфа);

page – початкова адреса сегмента повинна ділитися без остачі на 256 (вирівнювання на межу сторінки розміром 256 байтів);

mempage – початкова адреса сторінки ділитиметься без остачі на 4 К (адреса сторінки розміром 4 Кбайтів).

Якщо параметр відсутній, то за замовчуванням він вважається рівним para.

· тип-комбінування сегментів – повідомляє редакторові зв’язків як комбінувати сегменти, які мають однакові імена, але належать різним модулям. Значення цього операнда можуть бути такими:

private – сегмент не буде об’єднуватися з іншими сегментами з тим же іменем;

public – операнд вказує, що редактор зв’язків повинен об’єднати всі сегменти з однаковим іменем. Новий сегмент займатиме неперервну ділянку оперативної пам’яті. Всі адреси тепер будуть обчислюватися відносно нового початку сегмента;

common – означає, що всі сегменти з одним і тим же іменем будуть розміщуватися з однієї і тієї ж адреси, тобто будуть перекриватися і використовувати пам’ять сумісно. Розмір одержаного сегмента дорівнюватиме розміру найбільшого сегмента;

at xxxx – сегмент розміщуватиметься в оперативній пам’яті за абсолютною адресою параграфа (параграф – ділянка пам’яті, адреса якої вирівняна на межу кратну 16). Абсолютна адреса параграфа задається значенням виразу xxxx. Редактор зв’язків забезпечить розміщення даного сегмента за вказаною адресою xxxx (це можна використати, наприклад, для доступу до відеопам’яті або області постійної оперативної пам’яті). Щоб в процесі виконання даної програми була можливість звернення до даної пам’яті, потрібно у відповідний сегментний регістр завантажити задане в атрибуті значення;

stack – визначення сегмента стека. Всі однойменні сегменти об’єднуються в один і адреси в одержаному сегменті обчислюються відносно початкової адреси, яка визначається вмістом регістра ss. Комбінований тип stack аналогічний комбінованому типу public, за винятком того, що регістр ss є стандартним сегментним регістром для цього сегмента. Регістр sp/esp установлюється на кінець об’єднаного сегмента стека. Якщо не вказано жодного сегмента стека, то редактор зв’язків попереджує, що сегмент стека не знайдений. Якщо сегмент стека створено, а комбінований тип stack не використовується, то програміст зобов’язаний явно завантажити в регістр ss адресу сегмента (аналогічно, як це робиться для регістра ds).

Якщо параметр тип-комбінування відсутній, то його значення за замовчуванням private.

· клас-сегмента (тип класу) – рядок символів між апострофами або лапками, який допомагає редакторові зв’язків визначити порядок сегментів в остаточній програмі (завантажувальному модулі), якщо сегменти вибираються з декількох модулів. Редактор зв’язків об’єднує в пам’яті разом усі сегменти з одним і тим же іменем класу (найкраще, коли це ім’я відображує функціональне призначення сегмента, але загалом тип класу може бути будь-яким).

· тип-розміру-сегмента – може набувати двох значень: use16 і use32.

– use16 означає, що в сегменті можлива 16-бітова адресація і для формування фізичної адреси використовується тільки 16-бітове зміщення. Отже, сегмент має максимальний розмір 64 Кбайтів;

– use32 – сегмент 32-бітовий, формується 32-бітова фізична адреса і такий сегмент може мати максимальний розмір 4 Гбайтів.

Директива ends має загальний вигляд ім’я-сегмента ends і означає завершення сегмента.

Всі сегменти рівноправні, оскільки директиви segment і ends не містять інформації про функціональне призначення сегмента. Тому для повідомлення трансляторові про функціональне призначення сегмента використовується директива assume, загальний вигляд якої наступний:

assume cs: ім’я-сегмента, ds: ім’я-сегмента, ss: ім’я-сегмента,

es: ім’я-сегмента, fs: ім’я-сегмента, gs: ім’я-сегмента

Ця директива повідомляє трансляторові про те, який сегмент до якого сегментного регістра прив’язаний, що дозволяє трансляторові коректно пов’язувати символічні імена (ідентифікатори), які визначені в сегментах. У цій директиві потрібно вказувати тільки імена тих сегментів і сегментних регістрів, які використовуються в даній програмі. В директиві assume може використовуватися ключове слово nothing, за допомогою якого анулюються всі попередні призначення сегментних регістрів. Ключове слово nothing може бути єдиним операндом, тоді його дія стосується всіх сегментних регістрів. Якщо ж воно використовується замість ім’я-сегмента, то воно стосується тільки конкретного сегментного регістра.



Поделиться:


Последнее изменение этой страницы: 2017-01-27; просмотров: 321; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.106.241 (0.005 с.)