3.3.2. Модели памяти и упрощенные директивы определения сегментов

Модели памяти задаются директивой .MODEL

.model   модель,язык,модификатор

где модель - одно из следующих слов:

□ TINY - код, данные и стек размещаются в одном и том же сегменте разме­ром до 64 Кб. Эта модель памяти чаще всего используется при написании на ассемблере небольших программ;

Q SMALL - код размещается в одном сегменте, а данные и стек - в другом (для их описания могут применяться разные сегменты, но объединенные в одну группу). Эту модель памяти также удобно использовать для создания про­грамм на ассемблере;

□ COMPACT - код размещается в одном сегменте, а для хранения данных мо­гут использоваться несколько сегментов, так что для обращения к данным требуется указывать сегмент и смещение (данные дальнего типа);

□ MEDIUM - код размещается в нескольких сегментах, а все данные - в од­ном, поэтому для доступа к данным используется только смещение, а вызо­вы подпрограмм применяют команды дальнего вызова процедуры;

Q LARGE и HUGE — и код, и данные могут занимать несколько сегментов;

□ FLAT - то же, что и TINY, но используются 32-битные сегменты, такчто мак­симальный размер сегмента, содержащего и данные, и код, и стек, - 4 Мб.

Язык - необязательный операнд, принимающий значения С, PASCAL, BASIC, FORTRAN, SYSCALL и STDCALL. Если он указан, подразумевается, что Проце­дуры рассчитаны на вызов из программ на соответствующем языке высокого уровня, следовательно, если указан язык С, все имена ассемблерных процедур, объявленных как PUBLIC, будут изменены так, чтобы начинаться с символа под­черкивания, как это принято в С.

Модификатор - необязательный операнд, принимающий значения NEARSTACK (по умолчанию) или FARSTACK. Во втором случае сегмент стека не будет объединяться в одну группу с сегментами данных.

После того как модель памяти установлена, вступают в силу упрощенные директивы определения сегментов, объединяющие действия директив SEGMENT и ASSUME, Кроме того, сегменты, объявленные упрощенными директивами, не требуется закрывать директивой ENDS - они закрываются автоматически, как только ассемблер обнаруживает новую директиву определения сегмента или ко­нец программы.

Директива .CODE описывает основной сегмент кода

.code имя_сегмента

эквивалентно

_ТЕХТ segment  word       public 'CODE'

для моделей TINY, SMALL и COMPACT и name_TEXT segment word      public 'CODE'

для моделей MEDIUM, HUGE и LARGE (name - имя модуля, в котором описан данный сегмент). В этих моделях директива .CODE также допускает необязатель­ный операнд - имя определяемого сегмента, но все сегменты кода, описанные так в одном и том же модуле, объединяются в один сегмент с именем

. 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

В некоторых операционных системах этот сегмент будет загружен так, что попытка записи в него может привести к ошибке.

.fardata имя „сегментаимя_сегмента       segment  para      private 'FAR_DATA'

Доступ к данным, описанным в этом сегменте, потребует загрузки сегментно­го регистра. Если не указан операнд, в качестве имени сегмента используется FAR_DATA.

.fardata? имя_сегмента

Сегмент дальних неинициализированных данных:

имя_сегмента       segment  para      private 'FAR_BSS'

Как и в случае с FARDATA, доступ к данным из этого сегмента потребует заг­рузки сегментного регистра. Еслиимясегментанеуказано, используется FAR_BSS.

Во всех моделяхпамяти сегменты, представленные директивами .DATA^DATA?, .CONST, .FARDATAn .FARDATA?, а также сегмент, описанный директивой .STACK, если не был указан модификатор FARSTACK, и сегмент .CODE в модели TINY ав­томатически объединяются в группу с именем FLAT - для модели памяти FLAT или DGROUP - для всех остальных моделей. При этом сегментный регистр DS (и SS, если не было FARSTACK, и CS в модели TINY) настраивается на всю эту группу, как если бы была выполнена команда ASSUME.