Директива .MODEL


Директива .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