Для простых программ, содержащих по одному сегменту для кода, данных и стека, хотелось бы упростить ее описание. Для этого в трансляторы MASM и TASM ввели возможность использования упрощенных директив сегментации. Но здесь возникла проблема, связанная с тем, что необходимо было как-то компенсировать невозможность напрямую управлять размещением и комбинированием сегментов. Для этого совместно с упрощенными директивами сегментации стали использовать директиву указания модели памяти MODEL, которая частично стала управлять размещением сегментов и выполнять функции директивы ASSUME (поэтому при использовании упрощенных директив сегментации директиву ASSUME можно не использовать). Эта директива связывает сегменты, которые в случае использования упрощенных директив сегментации имеют предопределенные имена, с сегментными регистрами. Упрощенный формат директивы MODEL:
MODEL [ <модификатор>] <модель памяти> [ др. параметры ]
Параметр модификатор директивы MODEL позволяет уточнить некоторые особенности использования выбранной модели памяти (табл. 6).
|
|
Таблица 6. Модификаторы модели памяти
Значение модификатора | Назначение |
use16 | Сегменты выбранной модели используются как 16-битные (если соответствующей директивой указан процессор i80386 или i80486) |
use32 | Сегменты выбранной модели используются как 32-битные (если соответствующей директивой указан процессор i80386 или i80486) |
dos | Программа будет работать в MS-DOS |
Обязательным параметром директивы MODEL является модель памяти. Этот параметр определяет модель сегментации памяти для программного модуля (набор сегментов программы, размеры сегментов данных и кода, способ связывания сегментов и сегментных регистров). В табл. 5 приведены некоторые значения параметра модель памяти директивы MODEL.
Таблица 5. Модели памяти
Модель | Тип кода | Тип данных | Назначение модели |
TINY | near | near | Код и данные объединены в одну группу с именем DGROUP. Используется для создания программ формата.com. |
SMALL | near | near | Код занимает один сегмент, данные объединены в одну группу с именем DGROUP. Эту модель обычно используют для большинства программ на ассемблере |
MEDIUM | far | near | Код занимает несколько сегментов, по одному на каждый объединяемый программный модуль. Все ссылки на передачу управления — типа far. Данные объединены в одной группе; все ссылки на них — типа near |
COMPACT | near | far | Код в одном сегменте; ссылка на данные — типа far |
LARGE | far | far | Код в нескольких сегментах, по одному на каждый объединяемый программный модуль |
Предполагается, что программный модуль может иметь только определенные типы сегментов, которые определяются упомянутыми нами ранее упрощенными директивами описания сегментов. Эти директивы приведены в табл. 3.
|
|
Таблица 3. Упрощенные директивы определения сегмента
Формат директивы (режим MASM) | Формат директивы (режим IDEAL) | Назначение |
.CODE [имя] | CODESEG[имя] | Начало или продолжение сегмента кода |
.DATA | DATASEG | Начало или продолжение сегмента инициализированных данных. Также используется для определения данных типа near |
.CONST | CONST | Начало или продолжение сегмента постоянных данных (констант) модуля |
.DATA? | UDATASEG | Начало или продолжение сегмента неинициализированных данных. Также используется для определения данных типа near |
.STACK [размер] | STACK [размер] | Начало или продолжение сегмента стека модуля. Параметр [размер] задает размер стека |
.FARDATA [имя] | FARDATA [имя] | Начало или продолжение сегмента инициализированных данных типа far |
.FARDATA? [имя] | UFARDATA [имя] | Начало или продолжение сегмента неинициализированных данных типа far |
Наличие в некоторых директивах параметра [имя] говорит о том, что возможно определение нескольких сегментов этого типа. С другой стороны, наличие нескольких видов сегментов данных обусловлено требованием обеспечить совместимость с некоторыми компиляторами языков высокого уровня, которые создают разные сегменты данных для инициализированных и неинициализированных данных, а также констант.
При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, к которым можно обращаться во время работы программы, с тем, чтобы получить информацию о тех или иных характеристиках данной модели памяти (см. табл. 5). Перечислим эти идентификаторы и их значения (табл. 4).
Таблица 4. Идентификаторы, создаваемые директивой MODEL
Имя идентификатора | Значение переменной |
@code | Физический адрес сегмента кода |
@data | Физический адрес сегмента данных типа near |
@fardata | Физический адрес сегмента данных типа far |
@fardata? | Физический адрес сегмента неинициализированных данных типа far |
@curseg | Физический адрес сегмента неинициализированных данных типа far |
@stack | Физический адрес сегмента стека |
Необязательные параметры ([ др. параметры ]) определяют некоторые особенности вызова процедур. Необходимость в использовании этих параметров появляется при написании и связывании программ на различных языках программирования.
В листинге 1 приведен пример программы с использованием упрощенных директив сегментации:
Листинг 1. Использование упрощенных директив сегментации;---------Prg_3_1.asm-------------------------------masm;режим работы TASM: ideal или masmmodel small;модель памяти.data;сегмент данныхmessage db 'Введите две шестнадцатеричные цифры,$'.stack;сегмент стека db 256 dup ('?');сегмент стека.code;сегмент кодаmain proc;начало процедуры main mov ax,@data;заносим адрес сегмента данных в регистр ax mov ds,ax;ax в ds;далее текст программы mov ax,4c00h;пересылка 4c00h в регистр ax int 21h;вызов прерывания с номером 21hmain endp;конец процедуры mainend main;конец программы с точкой входа mainОписанные нами стандартные и упрощенные директивы сегментации не исключают друг друга. Стандартные директивы используются, когда программист желает получить полный контроль над размещением сегментов в памяти и их комбинированием с сегментами других модулей.
Упрощенные директивы целесообразно использовать для простых программ и программ, предназначенных для связывания с программными модулями, написанными на языках высокого уровня. Это позволяет компоновщику эффективно связывать модули разных языков за счет стандартизации связей и управления.