Головна |
Для простих програм, що містять по одному сегменту для коду, даних і стека опис спрощено. Для цього в транслятори MASM і TASM введена можливість використання спрощених директив сегментації. Спільно зі спрощеними директивами сегментації використовують директиву вказівки моделі пам'яті MODEL. Ця директива пов'язує сегменти, які, в разі використання спрощених директив сегментації, мають зумовлені імена з сегментними регістрами (хоча явно ініціалізувати DS все одно необхідно).
Обов'язковою параметром директиви MODEL є модель пам'яті.
Таблиця 2. - Моделі пам'яті
Модель | Тип коду | Тип даних | призначення моделі |
TINY | near | near | Код і дані об'єднані в одну групу з ім'ям DGROUP. Використовується для створення програм формату .сом. |
SMALL | near | near | Код займає один сегмент, дані об'єднані в одну групу з ім'ям DGROUP. Цю модель зазвичай використовують для більшості програм на асемблері. |
MEDIUM | far | near | Код займає кілька сегментів, по одному на кожен об'єднується програмний модуль. Всі номери передачу управління - типу far. Дані об'єднані в одній групі, всі посилання на них - типу near. |
COMPACT | near | far | Код в одному сегменті, посилання на дані - типу far. |
LARGE | far | far | Код в декількох сегментах, по одному на кожен об'єднується програмний модуль. |
FLAT | near | near | Код і дані в одному 32-бітному сегменті (плоска модель ОП). |
Таблиця 3. - Спрощені директиви визначення сегмента
формат директиви | призначення |
.CODE [Ім'я] | Початок або продовження сегмента коду |
.DATA | Початок або продовження сегмента ініціалізованих даних. Використовується також для визначення даних типу near |
.CONST | Початок або продовження сегмента постійних даних (констант) модуля |
.DATA? | Початок або продовження сегмента неініціалізованих даних. Використовується також для визначення даних типу near |
.STACK [Розмір] | Початок або продовження сегмента стека модуля. Параметр [розмір] задає розмір стека |
.FARDATA [Ім'я] | Початок або продовження сегмента ініціалізованих даних типу far |
.FARDAТА? [Ім'я] | Початок або продовження сегмента неініціалізованих даних типу far |
При використанні директиви MODEL транслятор робить доступними кілька ідентифікаторів, до яких можна звертатися під час роботи програми.
Операнди директиви MODEL використовуються для завдання моделі пам'яті, яка визначає набір сегментів програми, розміри сегментів даних і коду, спосіб зв'язування сегментів і сегментних регістрів. У наступній таблиці наведено деякі значення параметрів моделі пам'яті директиви MODEL.
Таблиця 4. - Ідентифікатори, створювані директивою MODEL
ім'я ідентифікатора | значення змінної |
@code | Фізична адреса сегмента коду |
@data | Фізична адреса сегмента даних типу near |
@fardata | Фізична адреса сегмента даних типу far |
@fardata? | Фізична адреса сегмента ініціалізованих даних типу far |
@curseg | Фізична адреса сегмента неініціалізованих даних типу far |
@stack | Фізична адреса сегмента стека |
Для порівняння наведемо три лістингу з програмами на асемблері. Функціонально вони однакові і виводять на консоль повідомлення: «Hello World!».
Лістинг 1 містить програму зі стандартними директивами сегментації, а лістинг 2, відповідно, - з спрощеними, лістинг 3 містить програму типу .com.
Лістинг 1. Використання стандартних директив сегментації.
data segment para public 'data'
message db 'Hello World! $ ';сегмент даних
data ends
stk segment stack;сегмент стека
db 256 dup ('?')
stk ends
code segment para public 'code';початок сегмента коду
start:;точка входу в програму
assume cs: code, ds: data, ss: stk
mov ax, data;адреса сегмента даних
mov ds, ax; в регістр ах
mov ah, 9h ; Завантаження номера функції
mov dx, offset message ; Завантаження зміщення рядка
int 21h;висновок повідомлення на екран
mov ax, 4c00h ; Функція завершення
int 21h
code ends;кінець сегмента коду
end start;кінець програми з точкою входу start
Лістинг 2. Використання спрощених директив сегментації.
masm;режим роботи для TASM
.model small;модель пам'яті
.data;сегмент даних
message db 'Hello World $'
.stack 256;сегмент стека 256 байт
.code; сегмент коду
start:
mov ax, @ data
mov ds, ax
mov ah, 9h
mov dx, offset message
int 21h
mov ax, 4c00h
int 21h
end start
Лістинг 3. Створення програми типу .com.
.model small
.code
org 100h ; Зміщення на 100h від початку сегмента
begin:
jmp start ; Перехід на мітку start
message db 'Hello World $'
start:
mov ah, 9h
mov dx, offset message
int 21h
mov ax, 4c00h
int 21h
end begin
ДИРЕКТИВИ СЕГМЕНТАЦІЇ | ДИРЕКТИВИ РЕЗЕРВУВАННЯ І ІНІЦІАЛІЗАЦІЇ ДАНИХ
ОСНОВИ АЛГОРИТМІЗАЦІЇ І ПРОГРАМУВАННЯ | Етапи розвитку ЕОМ | покоління ЕОМ | МАШИННО-ОРІЄНТОВАНІ МОВИ ПРОГРАМУВАННЯ | АРХІТЕКТУРА ЕОМ | МІКРОПРОЦЕСОРИ INTEL | Регістри загального призначення | Регістри стану і управління | Сегментна організація пам'яті | ТИПИ ДАНИХ |