Директива .MODEL определяет модель памяти в модуле Ассембле-ра, где используются упрощенные директивы определения сегментов. Заметим, что в «ближнем» коде переходы осуществляются с помощью загрузки одного регистра IP, а в «дальнем» коде — путем загрузки регистров CS и IP. Аналогично, к «ближним» данным обращение вы-полняется только по смещению, а к «дальним» — с помощью полного адреса «сегмент:смещение». Вкратце, термин «дальний» (FAR) озна-чает использование полного 32-разрядного адреса («сегмент:смеще-ние»), а «ближний» (NEAR) означает использование 16-разрядных смещений.
Существуют следующие модели памяти:
Сверхмалая И код программы, и ее данные должны размещаться
внутри одного и того же сегмента размером 64К.
Код и данные имеют ближний тип.
Малая Код программы должен размещаться внутри одного
сегмента данных размером 64К, а данные программы
должны размещаться в отдельном сегмента данных
(размером 64К). И код, и данные должны быть ближ-
него типа.
Средняя Код программы может превышать 64К, но данные
программы должны помещаться в один сегмент разме-
ром 64К. Код имеет дальний тип, а данные — ближ-
ний.
Компактная Код программы должен помещаться в один сегмент
размером 64К, а данные могут превышать по размеру
64К. Код имеет ближний тип, а данные — дальнего
типа.
Большая И код, и данные программы могут превышать 64К, но
один массив данных не может превышать 64К. И код,
и данные имеют дальний тип.
Сверхбольшая И код, и данные программы могут превышать по раз-
меру 64К. Массивы данных также могут превышать
64К. Код и данные имеют дальний тип. Указатели на
элементы массива также дальнего типа.
Заметим, что с точки зрения Ассемблера большая и сверхболь-шая модели идентичны. Сверхбольшая модель не поддерживает автома-тически массивы данных, превышающие 64К.
Немногие программы на Ассемблере используют более 64К кода или данных, поэтому для большинства прикладных задач подходит ма-лая модель. Вы должны использовать малую модель там, где это воз-можно, так как дальний код (средняя, большая и сверхбольшая мо-дель) замедляет выполнение программы, а с данными дальнего типа (компактная, большая и сверхбольшая модель) на Ассемблере рабо-тать значительно труднее.
Описанные здесь модели памяти соответствуют моделям, исполь-зуемым в Турбо Си (и во многих других компиляторах для компьютера IBM PC). Когда вы компонуете модуль на Ассемблере с языком высо-кого уровня, убедитесь, что используется правильная директива .MODEL. Эта директива обеспечивает соответствие имен сегментов Ассемблера тем именам, которые используются в языках высокого уровня, а также используемого по умолчанию типа меток PROC, ис-пользующихся для наименования подпрограмм, процедур и функций, типу (ближнему или дальнему), используемому в языках высокого уровня.
Директиву .MODEL необходимо указывать, если вы используете упрощенные директивы определения сегментов, так как в противном случае Турбо Ассемблер не будет знать как устанавливать сегменты, определенные с помощью директив .CODE и .DATA. Директива .MODEL должна предшествовать директивам .CODE, .DATA и .STACK.
Приведем пример наброска программы, использующей упрощенные директивы определения сегментов:
DOSSEG
.MODEL small
.STACK 200h
.DATA
MemVar DW 0
.CODE ProgramStart:
mov ax,@data
mov ds,ax
mov ax,[MemVar]
mov ah,4ch
int 21h
END ProgramStart