
3.2. Моделі пам'яті й спрощені директиви визначення сегментів
Моделі пам'яті задаються директивою .MODEL
.model модель,мова,модифікатор
де модель — одне з наступних слів:
TINY — код, дані й стік розміщаються в тому самому сегменті розміром до 64 Кб. Ця модель пам'яті найчастіше використовується при написанні на асемблері невеликих програм;
SMALL — код розміщається в одному сегменті, а дані й стік — в іншому ( для їхнього опису можуть застосовуватися різні сегменти, але об'єднані в одну групу). Цю модель пам'яті також зручно використовувати для створення програм на асемблері;
COMPACT — код розміщається в одному сегменті, а для зберігання даних можуть використовуватися кілька сегментів, так що для звертання до даних потрібно вказувати сегмент і зсув (дані далекого типу);
MEDIUM — код розміщається в декількох сегментах, а всі дані — в одному, тому для доступу до даних використовується тільки зсув, а виклики підпрограм застосовують команди далекого виклику процедури;
LARGE і HUGE — і код, і дані можуть займати кілька сегментів;
FLAT — те ж, що й TINY, але використовуються 32-бітні сегменти, так що максимальний розмір сегмента, що містить і дані, і код, і стік, — 4 Мб.
Мова — необов'язковий операнд, що ухвалює значення C, PASCAL, BASIC, FORTRAN, SYSCALL і STDCALL. Якщо він зазначений, мається на увазі, що процедури розраховані на виклик із програм відповідною мовою високого рівня, отже, якщо зазначена мова C, усе імена ассемблерных процедур, оголошених як PUBLIC, будуть змінені так, щоб починатися із символу підкреслення, як це прийняте в C.
Модифікатор — необов'язковий операнд, що ухвалює значення NEARSTACK ( за замовчуванням) або FARSTACK. У другому випадку сегмент стека не буде поєднуватися в одну групу із сегментами даних.
Після того як модель пам'яті встановлена, набувають чинності спрощені директиви визначення сегментів, що поєднують дії директив SEGMENT і ASSUME. Крім того, сегменти, оголошені спрощеними директивами, не потрібно закривати директивою ENDS — вони закриваються автоматично, як тільки асемблер виявляє нову директиву визначення сегмента або кінець програми.
Директива .CODE описує основний сегмент коду
.code ім'я_сегмента
еквівалентно
_TEXT segment word public ’CODE’
для моделей TINY, SMALL і COMPACT і
name_TEXT segment word public ’CODE’
для моделей MEDIUM, HUGE і LARGE (name — ім'я модуля, у якім описаний даний сегмент). У цих моделях директива .CODE також допускає необов'язковий операнд — ім'я обумовленого сегмента, але всі сегменти коду, описані так у тому самому модулі, поєднуються в один сегмент із іменем NAME_TEXT.
.stack розмір
Директива .STACK описує сегмент стека й еквівалентна директиві
STACK segment para public ’stack’
Необов'язковий параметр указує розмір стека. За замовчуванням він рівний 1 Кб.
.data
Описує звичайний сегмент даних і відповідає директиві
_DATA segment word public ’DATA’
.data?
Описує сегмент неинициализированных даних:
_BSS segment word public ’BSS’
Цей сегмент звичайно не включається в програму, а розташовується за кінцем пам'яті, так що всі описані в ньому змінні на момент завантаження програми мають невизначені значення.
.const
Описує сегмент незмінних даних:
CONST segment word public ’CONST’
У деяких операційних системах цей сегмент буде завантажений так, що спроба запису в нього може привести до помилки.
.fardata ім'я_сегмента
Сегмент далеких даних:
ім'я_сегмента segment para private ’FAR_DATA’
Доступ до даних, описаних у цьому сегменті, зажадає завантаження сегментного регістру. Якщо не зазначений операнд, у якості імені сегмента використовується FAR_DATA.
.fardata? ім'я_сегмента
Сегмент далеких неинициализированных даних:
ім'я_сегмента segment para private ’FAR_BSS’
Як і у випадку з FARDATA, доступ до даних із цього сегмента зажадає завантаження сегментного регістру. Якщо ім'я сегмента не зазначене, використовується FAR_BSS.
У всіх моделях пам'яті сегменти, представлені директивами .DATA, .DATA?, .CONST, .FARDATA і .FARDATA?, а також сегмент, описаний директивою .STACK, якщо не був зазначений модифікатор FARSTACK, і сегмент .CODE у моделі TINY автоматично поєднуються в групу з іменем FLAT — для моделі пам'яті FLAT або DGROUP — для всіх інших моделей. При цьому сегментний регістр DS (і SS, якщо не було FARSTACK, і CS у моделі TINY) настроюється на всю цю групу, як якби була виконана команда ASSUME.