Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

1. В ы р а в н и в а н и е. Данный параметр определяет границу

начала сегмента. Обычным значением является PARA, по которому сегмент

устанавливается на границу параграфа. В этом случае начальный адрес

делится на 16 без остатка, т.е. имеет шест. адрес nnn0. В случае

отсутствия этого операнда ассемблер принимает по умолчанию PARA.

2. О б ъ е д и н е н и е. Этот элемент определяет объединяется

ли данный сегмент с другими сегментами в процессе компановки после

ассемблирования (пояснения см. в следующем разделе "Компановка

программы"). Возможны следующие типы объединений: STACK, COMMON,

PUBLIC, AT выражение и MEMORY. Сегмент стека определяется следующим

образом:

имя SEGMENT PARA STACK

Когда отдельно ассемблированные программы должны объединяться

компановщиком, то можно использовать типы: PUBLIC, COMMON и MEMORY. В

случае, если программа не должна объединяться с другими программами,

то данная опция может быть опущена.

3. К л а с с. Данный элемент, заключенный в апострофы,

используется для группирования относительных сегментов при

компановке:

имя SEGMENT PARA STACK 'Stack'

Фрагмент программы на рис.3.1. в следующем разделе иллюстрирует

директиву SEGMENT и ее различные опции.

Директива PROC

----------------

Сегмент кода содержит выполняемые команды программы. Кроме того этот

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

директивой PROC. Сегмент, содержащий только одну процедуру имеет следующий

вид:

имя-сегмента SEGMENT PARA

имя-процедуры PROC FAR Сегмент

. кода

. с

. одной

RET процедурой

имя-процедуры ENDP

имя-сегмента ENDS

Имя процедуры должно обязательно присутствовать, быть уникальным и

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

загрузчику DOS, что начало данной процедуры является точкой входа для

выполнения программы.

Директива ENDP определяет конец процедуры и имеет имя, аналогичное

имени в директиве PROC. Команда RET завершает выполнение программы и в

данном случае возвращает управление в DOS.

Сегмент может содержать несколько процедур (см. гл.7).

Директива ASSUME

------------------

Процессор использует регистр SS для адресации стека, регистр DS для

адресации сегмента данных и регистр CS для адресации cегмента кода.

Ассемблеру необходимо сообщить назначение каждого сегмента. Для этой цели

служит директива ASSUME, кодируемая в сегменте кода следующим образом:

Директива Операнд

ASSUME SS:имя_стека,DS:имя_с_данных,CS:имя_с_кода

Например, SS:имя_стека указывает, что ассемблер должен ассоциировать

имя сегмента стека с регистром SS. Операнды могут записываться в любой

последовательности. Регистр ES также может присутствовать в числе

операндов. Если программа не использует регистр ES, то его можно опустить

или указать ES:NOTHING.

Директива END

---------------

Как уже показано, директива ENDS завершает сегмент, а директива ENDP

завершает процедуру. Директива END в свою очередь полностью завершает всю

программу:

Директива Операнд

END [имя_процедуры]

Операнд может быть опущен, если программа не предназначена для

выполнения, например, если ассемблируются только определения данных, или

эта программа должна быть скомпанована с другим (главным) модулем. Для

обычной программы с одним модулем oперанд содержит имя, указанное в

директиве PROC, которое было oбозначено как FAR.

ПАМЯТЬ И РЕГИСТРЫ

________________________________________________________________

Рассмотрим особенности использования в командах имен, имен в

квадратных скобках и чисел. В следующих примерах положим, что WORDA

определяет слово в памяти:

MOV AX,BX ;Переслать содержимое BX в регистр AX

MOV AX,WORDA ;Переслать содержимое WORDA в регистр AX

MOV AX,[BX] ;Переслать содержимое памяти по адресу

; в регистре BX в регистр AX

MOV AX,25 ;Переслать значение 25 в регистр AX

MOV AX,[25] ;Переслать содержимое по смещению 25

Новым здесь является использование квадратных скобок, что потребуется

в следующих главах.

ИНИЦИАЛИЗАЦИЯ ПРОГРАММЫ

________________________________________________________________

Существует два основных типа загрузочных программ: EXE и COM.

Рассмотрим требования к EXE-программам, а COM-программы будут представлены

в гл.6. DOS имеет четыре требования для инициализации ассемблерной

EXE-программы: 1) указать ассемблеру, какие cегментные регистры должны

соответствовать сегментам, 2) сохранить в стеке адрес, находящийся в

регистре DS, когда программа начнет выполнение, 3) записать в стек нулевой

адрес и 4) загрузить в регистр DS адрес сегмента данных.

Выход из программы и возврат в DOS сводится к использованию команды

RET. Рис.3.1 иллюстрирует требования к инициализации и выходу из

программы: