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

0002Н, length - 000ан (соответственно операнду dup) и size - произведение

типа и длины, т.е. 14Н (20).

ДИРЕКТИВЫ АССЕМБЛЕРА

________________________________________________________________

В данном разделе описано большинство ассемблерных директив. В гл.5

были подробно рассмотрены директивы для определения данных (DB, DW и

проч.).

Директива ASSUME

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

Назначение директивы ASSUME - установить для ассемблера связь между

сегментами и сегментными регистрами CS, DS, ES и SS. Формат директивы:

ASSUME сегментный_регистр:имя [, ... ]

В директиве указываются имена сегментных регистров, групп (GROUP) и

выражений SEG. Одна директива ASSUME может назначить до четырех сегментных

регистров в любой последовательности, например:

ASSUME CS:CODESG,DS:DATASG,SS:STACK,ES:DATASG

Для отмены любого ранее назначенного в директиве ASSUME сегментного

регистра необходимо использовать ключевое слово NOTHING:

ASSUME ES:NOTHING

Если, например, регистр DS оказался не назначен или отменен ключевым

словом NOTHING, то для ссылки к элементу из сегмента данных в командах

используется операнд со ссылкой к регистру DS:

MOV AX,DS:[BX] ;Использование индексного адреса

MOV AX,DS:FLDW ;Пересылка содержимого поля FLDW

Конечно, регистр DS должен содержать правильное значение сегментного

адреса.

Директива EXTRN

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

Назначение директивы EXTRN - информировать ассемблер о переменных и

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

модуля. Формат директивы:

EXTRN имя: тип [, ... ]

Директива EXTRN подробно рассмотрена в гл.21.

Директива GROUP

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

Программа может содержать несколько сегментов одного типа (код,

данные, стек). Назначение директивы GROUP - собрать однотипные сегменты

под одно имя так, чтобы они поместились в один сегмент объемом 64 Кбайт,

формат директивы:

имя GROUP имя сегмента [, ... ]

Следующая директива GROUP объединяет SEG1 и SEG2 в одном ассемблерном

модуле:

GROUPX GROUP SEG1,SEG2

SEG1 SEGMENT PARA 'CODE'

ASSUME CS:GROUPX

SEG1 ENDS

SEG2 SEGMENT PARA 'CODE'

ASSUME CS:GROUPX

SEG2 ENDS

Директива INCLUDE

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

Отдельные фрагменты ассемблерного кода или макрокоманды могут

использоваться в различных программах. Для этого такие фрагменты и

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

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

преобразующая ASCII-код в двоичное представление, записана на диске С в

файле по имени CONVERT.LIB. Для доступа к этому файлу необходимо указать

директиву

Include c:convert.Lib

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

подпрограмма преобразования ASCII-кода. В результате ассемблер найдет

необходимый файл на диске и вставит его содержимое в исходную программу.

(Если файл не будет найден, то ассемблер выдаст соответствующее сообщение

об ошибке и директива INCLUDE будет игнорирована.)

Для каждой вставленной строки ассемблер выводит в LST-файл в 30-й

колонке символ С (исходный текст в LST-файле начинается с 33-й колонки).

В гл.20 (Макрокоманды) дан практический пример директивы INCLUDE и

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

первом проходе ассемблера.

Директива LABEL

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

Директива LABEL позволяет переопределять атрибут определенного имени.

Формат директивы:

имя LABEL тип

В качестве типа можно использовать BYTE, WORD или DWORD для

переопределения областей данных или имен структур или битовых строк.

Директивой LABEL можно переопределить выполнимый код, как NEAR или FAR.

Эта директива позволяет, например, определить некоторое поле и как DB, и

как DW. Ниже проиллюстрировано использование типов BYTE и WORD:

REDEFB LABEL BYTE

FIELDW DW 2532H

REDEFW LABEL WORD

FIELDB DB 25H

DB 32H

MOV AL,REDEFB ;Пересылка первого байта

MOV BX,REDEFW ;Пересылка двух байтов

Первая команда MOV пересылает только первый байт поля FIELDW. Вторая

команда MOV пересылает два байта, начинающихся по адресу FIELDB. Оператор

PTR выполняет аналогичные действия.

Директива NAME

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

Директива NAME обеспечивает другой способ назначения имени модулю:

NAME имя

Ассемблер выбирает имя модуля в следующем порядке:

1) если директива NAME присутствует, то ее операнд становится

именем модуля;

2) если директива NAME отсутствует, то ассемблер использует

первые шесть символов из директивы TITLE;

3) если обе директивы NAME и TITLE отсутствуют, то именем модуля

становится имя исходного файла.

Выбранное имя передается ассемблером в компоновщик.

Директива ORG

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

Для определения относительной позиции в сегменте данных или кода

ассемблер использует адресный счетчик. Рассмотрим сегмент данных со

следующими определениями:

Смещение Имя Операция Операнд Адресный счетчик

00 FLDA DW 2542H 02

02 FLDB DB 36H 03

03 FLDC DW 212EH 05

05 FLDD DD 00000705H 09

Начальное значение адресного счетчика - 00. Так как поле FLDA

занимает два байта, то для получения адреса следующего элемента адресный

счетчик увеличивается до значения 02. Поле FLDB занимает один байт, значит

значение адресного счетчика увеличивается до значения 03 и т.д.. Для

изменения значения адресного счетчика и соответственно адреса следующего

определяемого элемента используется директива ORG. Формат директивы:

OR6 выражение

Выражение может быть абсолютным числом, но не символическим именем, и

должно формировать двухбайтовое абсолютное число. Рассмотрим следующие

элементы данных, определенные непосредственно после поля FLDD:

Смещение Имя Операция Операнд Адресный счетчик

ORG 0 00