ТОП 10:

Data segment para public 'data' ;сегмент данных



message db 'Hello World,$' ; описание строки

Data ends

Stk segment stack

Db 256 dup ('?') ; размер сегмента стека

Stk ends

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

; кода

Main proc ;начало процедуры main

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

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

; в регистр ax

Mov ds,ax ; ax в ds

...

Mov ah,9

Mov dx,offset message

int 21h ; ah=9 функция 21h прерывания

; выводит строку на экран, адрес

; которой храниться в регистре dx,

; строка должна обязательно

; заканчиваться символом $

...

Mov ax,4c00h ; пересылка 4c00h в регистр ax

Int 21h ; вызов прерывания с номером 21h

Main endp ; конец процедуры main

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

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

 

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

Теперь, перепишем вышеприведенную программу с использованием упрощенных директив сегментации.

 

Мasm ;режим работы TASM: ideal или masm

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

Data ; сегмент данных

message db 'Hello World,$' ; описание строки

Stack ;сегмент стека

Db 256 dup ('?') ; сегмент стека

Code ;сегмент кода

Main proc ; начало процедуры main

mov ax,@data ; заносим адрес сегмента данных в

; регистр ax

Mov ds,ax ;ax в ds

...

Mov ah,9

Mov dx,offset message

int 21h ; ah=9 функция 21h прерывания

; выводит строку на экран, адрес

; которой храниться в регистре dx

...

Mov ax,4c00h ; пересылка 4c00h в регистр ax

Int 21h ; вызов прерывания с номером 21h

Main endp ; конец процедуры main

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

 

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

 

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

Формат директивы (режим MASM) Формат директивы (режим IDEAL) Назначение
.CODE [имя] CODESEG[имя] Начало или продолжение сегмента кода
.DATA DATASEG Начало или продолжение сегмента инициализированных данных. Также используется для определения данных типа near
.CONST CONST Начало или продолжение сегмента постоянных данных (констант) модуля
.FARDATA [имя] FARDATA [имя] Начало или продолжение сегмента инициализированных данных типа far

 

Наличие в некоторых директивах параметра [имя] говорит о том, что возможно определение нескольких сегментов этого типа. С другой стороны, наличие нескольких видов сегментов данных обусловлено требованием обеспечения совместимости с некоторыми компиляторами языков высокого уровня, которые создают разные сегменты данных для инициализированных и неинициализированных данных, а также констант.

При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, к которым можно обращаться во время работы программы, с тем, чтобы получить информацию о тех или иных характеристиках данной модели памяти (таблица 3). Перечислим эти идентификаторы и их значения (табл. 2).

 

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

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

 

Параметр модификатор директивы MODEL позволяет уточнить некоторые особенности использования выбранной модели памяти (табл. 3).

 

Таблица 3. Модификаторы модели памяти

Значение модификатора Назначение
use16 Сегменты выбранной модели используются как 16-битные (если соответствующей директивой указан процессор i80386 или i80486)
use32 Сегменты выбранной модели используются как 32-битные (если соответствующей директивой указан процессор i80386 или i80486)
dos Программа будет работать в MS-DOS

 

Необязательные параметры – язык и модификатор языка, определяют некоторые особенности вызова процедур. Необходимость в использовании этих параметров появляется при написании и связывании программ на различных языках программирования.

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

Упрощенные директивы целесообразно использовать для простых программ и программ, предназначенных для связывания с программными модулями, написанными на языках высокого уровня. Это позволяет компоновщику эффективно связывать модули разных языков за счет стандартизации связей и управления.

Создание СОМ-программ

Все вышеприведенные директивы сегментации и примеры программ предназначены для создания программ в EXE-формате[5]. Компоновщик LINK автоматически генерирует особый формат для EXE-файлов, в котором присутствует специальный начальный блок (заголовок) размером не менее 512 байт.

Для выполнения можно также создавать COM-файлы. Примером часто используемого COM-файла является COMMAND.COM.

Размер программы. EXE-программа может иметь любой размер, в то время как COM-файл ограничен размером одного сегмента и не превышает 64К. COM-файл всегда меньше, чем соответствующий EXE-файл; одна из причин этого - отсутствие в COM-файле 512-байтового начального блока EXE-файла.

Сегмент стека. В EXE-программе определяется сегмент стека, в то время как COM-программа генерирует стек автоматически. Таким образом, при создании ассемблерной программы, которая будет преобразована в COM-файл, стек должен быть опущен.

Сегмент данных. В EXE программе обычно определяется сегмент данных, а регистр DS инициализируется адресом этого сегмента. В COM-программе все данные должны быть определены в сегменте кода. Ниже будет показан простой способ решения этого вопроса.

Инициализация. EXE-программа записывает нулевое слово в стек и инициализирует регистр DS. Так как COM-программа не имеет ни стека, ни сегмента данных, то эти шаги отсутствуют.

Когда COM-программа начинает работать, все сегментные регистры содержат адрес префикса программного сегмента (PSP), ­­–­ 256-байтового (шест. 100) блока, который резервируется операционной системой DOS непосредственно перед COM или EXE программой в памяти. Так как адресация начинается с шест. смещения 100 от начала PSP, то в программе после оператора SEGMENT кодируется директива ORG 100H.

Обработка. Для программ в EXE и COM форматах выполняется ассемблирование для получения OBJ-файла, и компоновка для получения EXE-файла. Если программа создается для выполнения как EXE-файл, то ее уже можно выполнить. Если же программа создается для выполнения как COM-файл, то компоновщиком будет выдано сообщение:

Warning: No STACK Segment

(Предупреждение: Сегмент стека не определен)

 

Ниже приведем пример COM-программы:

CSEG Segment 'Code'







Последнее изменение этой страницы: 2016-08-16; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.226.243.36 (0.005 с.)