Упрощённые директивы сегментации

Для простых программ, содержащих по одному сегменту для кода, данных и стека описание упрощено. Для этого в трансляторы MASM и TASM введена возможность использования упрощенных директив сегментации. Совместно с упрощенными директивами сегментации используют директиву указания модели памяти MODEL. Эта директива связывает сегменты, которые, в случае использования упрощенных директив сегментации, имеют предопределенные имена с сегментными регистрами (хотя явно инициализировать DS все равно необходимо).

Обязательным параметром директивы MODEL является модель памяти.

 

Таблица 2. – Модели памяти

 

Модель Тип кода Тип данных Назначение модели
TINY near near Код и данные объединены в одну группу с именем DGROUP. Используется для создания программ формата .сом.
SMALL near near Код занимает один сегмент, данные объединены в одну группу с именем DGROUP. Эту модель обычно используют для большинства программ на ассемблере.
MEDIUM far near Код занимает несколько сегментов, по одному на каждый объединяемый программный модуль. Все ссылки на передачу управления - типа far. Данные объединены в одной группе, все ссылки на них - типа near.
COMPACT near far Код в одном сегменте, ссылка на данные - типа far.
LARGE far far Код в нескольких сегментах, по одному на каждый объединяемый программный модуль.
FLAT near near Код и данные в одном 32-битном сегменте (плоская модель ОП).

 

Таблица 3. – Упрощенные директивы определения сегмента

 

Формат директивы Назначение
.CODE[имя] Начало или продолжение сегмента кода
.DATA Начало или продолжение сегмента инициализированных данных. Используется также для определения данных типа near
.CONST Начало или продолжение сегмента постоянных данных (констант) модуля
.DATA? Начало или продолжение сегмента неинициализированных данных. Используется также для определения данных типа near
.STACK [размер] Начало или продолжение сегмента стека модуля. Параметр [размер] задает размер стека
.FARDATA [имя] Начало или продолжение сегмента инициализированных данных типа far
.FARDAТА? [имя] Начало или продолжение сегмента неинициализированных данных типа far

 

При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, к которым можно обращаться во время работы программы.

Операнды директивы MODEL используются для задания модели памяти, которая определяет набор сегментов программы, размеры сегментов данных и кода, способ связывания сегментов и сегментных регистров. В следующей таблице приведены некоторые значения параметров модели памяти директивы MODEL.

 

Таблица 4. – Идентификаторы, создаваемые директивой MODEL

 

Имя идентификатора Значение переменной
@code Физический адрес сегмента кода
@data Физический адрес сегмента данных типа near
@fardata Физический адрес сегмента данных типа far
@fardata? Физический адрес сегмента инициализированных данных типа far
@curseg Физический адрес сегмента неинициализированных данных типа far
@stack Физический адрес сегмента стека

 

Для сравнения приведем три листинга с программами на ассемблере. Функционально они одинаковы и выводят на консоль сообщение: «Hello World!».

Листинг 1 содержит программу со стандартными директивами сегментации, а листинг 2, соответственно, — с упрощенными, листинг 3 содержит программу типа .com.

Листинг 1. Использование стандартных директив сегментации.

data segment para public 'data'

message db 'Hello World! $' ;сегмент данных

data ends

stk segment stack ;сегмент стека

db 256 dup ('?')

stk ends

code segment para public 'code' ;начало сегмента кода

start: ;точка входа в программу

assume cs:code,ds:data,ss:stk

mov ax,data ;адрес сегмента данных

mov ds,ax ; в регистр ах

mov ah,9h ;загрузка номера функции

mov dx,offset message ;загрузка смещения строки

int 21h ;вывод сообщения на экран

mov ax,4c00h ;функция завершения

int 21h

code ends ;конец сегмента кода

end start ;конец программы с точкой входа start

 

Листинг 2. Использование упрощенных директив сегментации.

masm ;режим работы для TASM

.model small ;модель памяти

.data ;сегмент данных

message db 'Hello World$’

.stack 256 ;сегмент стека 256 байт

.code ; сегмент кода

start:

mov ax,@data

mov ds,ax

mov ah,9h

mov dx,offset message

int 21h

mov ax,4c00h

int 21h

end start

 

Листинг 3. Создание программы типа .com.

 

.model small

.code

org 100h ;смещение на 100h от начала сегмента

begin:

jmp start ;переход на метку start

message db 'Hello World$’

start:

mov ah,9h

mov dx,offset message

int 21h

mov ax,4c00h

int 21h

end begin