Модели памяти
End main
Code ends
Main endp
Data ends
Stk ends
data segment para public ‘data’ ;объявление сегмента данных
mes db “Введите данные, $ ”
code segment para public “code” ;объявление сегмента кода
main proc; начинается процедура
assume cs:code, ds:data, ss:stk; логическая связь
mov ax, data ;адрес начала данных загружаем в регистр ax
mov ds, ax; загрузка сегментного регистра ds
mov ah, 9h ;номер функции вывода сообщения
mov dx, offset mes;загрузка адреса строки в регистр dx
int 21h;вывод сообщения на экран
mov ax, 4c00h; номер функции возврата
int 21h ;возврат в ОС
Модель памяти определяет набор сегментов программы, размеры сегментов данных и кода, способ связывания сегментов и сегментных регистров. Транслятору необходимо указать модель памяти с помощью директивы Model:
MODEL <модель памяти> [, <язык>]
Типы моделей памяти:
TINY – для программ имеющих всего один сегмент (имеют расширение .com).
SMALL– по этой директиве создается программа с одним сегментом кода, а данные объединены в одну группу.
MEDIUM – несколько сегментов кода (по одному на каждый модуль в объединенной группе), а данные - в одной группе.
COMPACT – код в одном сегменте, данные – в одной группе. Обращение к данным по ссылке far.
LARGE – код в нескольких сегментах (по одному на каждый модуль).
Для простых программ, содержащих по одному сегменту кода, данных, стека можно воспользоваться упрощенными директивами сегментации:
.code [имя] – начало или продолжение сегмента кода.
.data – начало или продолжение инициализированных данных.
.const – начало или продолжение сегмента констант.
.data? – начало или продолжение сегмента неинициализированных данных.
.stack [размер] - начало или продолжение сегмента стека.
.fardata - начало или продолжение сегмента инициализированных данных типа far.
.fardata? - начало или продолжение сегмента неинициализированных данных типа far.
Идентификаторы, создаваемые директивой Model:
@data – физический адрес сегмента данных (ближний адрес).
@code - физический адрес сегмента кода, назначенный CS.
@fardata - физический адрес сегмента данных (дальний адрес).
@stack – сегментный адрес сегмента стека.
Любой из этих адресов загружается в соответствующий сегментный регистр (не напрямую, а через промежуточный регистр).
Пример программы, которая использует упрощенные директивы сегментации: