[Назад] [Далее]

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

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

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

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

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

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

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

_TEXT          segment   word   public   ’CODE’

для моделей TINY, SMALL и COMPACT и

name_TEXT      segment   word   public   ’CODE’

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

               .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   ’CONST’

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

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

Сегмент дальних данных:

имя_сегмента   segment   para   private   ’FAR_DATA’

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

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

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

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

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

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


п»ї
"target=_blank><\/a>") //-->