Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Определение Число байтов




DB 1

DW 2

DD 4

DQ 8

DT 10

STRUC Число байтов, определённых в STRUC

NEAR метка FFFF

FAR метка FFFE

Формат оператора TYPE:

TYPE переменная или метка

Директивы ассемблера

Директива 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 имя: тип [,... ]

Директива GROUP

Программа может содержать несколько сегментов одного типа (код, данные, стек). Назначение директивы GROUP — собрать однотипные сегменты под одно имя так, чтобы они поместились в один сегмент объемом 64 Кбайт, формат директивы:

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

Директива INCLUDE

Отдельные фрагменты ассемблерного кода или макрокоманды могут использоваться в различных программах. Для этого такие фрагменты и макрокоманды записываются в отдельные дисковые файлы, доступные для использования из любых программ. Пусть некоторая подпрограмма, преобразующая ASCII-код в двоичное представление, записана на диске С в файле по имени CONVERT.LIB. Для доступа к этому файлу необходимо указать директиву

INCLUDE C:CONVERT.LIB

причем в том месте исходной программы, где должна быть закодирована подпрограмма преобразования ASCII-кода. В результате Ассемблер найдет необходимый файл на диске и вставит его содержимое в исходную программу. (В случае, если файл не будет найден, то Ассемблер выдаст соответствующее сообщение об ошибке и директива INCLUDE будет игнорирована.) Для каждой вставленной строки Ассемблер выводит в LST-файл в 30-й колонке символ С (исходный текст в LST-файле начинается с 33-й колонки).

Директива LABEL

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

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

имя LABEL тип

 

В качестве типа можно использовать BYTE, WORD или DWORD для переопределения областей данных или имен структур или битовых строк.

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

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

Директива NAME

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

NAME имя

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

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

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

3) если обе директивы NAME и TITLE отсутствуют, то именем модуля становится имя исходного файла.

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

Директива ORG

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

Начальное значение адресного счетчика — 00. Для изменения значения адресного счетчика и соответственно адреса следующего определяемого элемента используется директива ORG. Формат директивы:

ORG выражение

Выражение может быть абсолютным числом, но не символическим именем, и должно формировать двухбайтовое абсолютное число.

Директива PROC

Любая процедура представляет собой совокупность кодов, начинающуюся директивой PROC и завершающуюся директивой ENDP. Обычно эти директивы используются для подпрограмм в кодовом сегменте. Ассемблер допускает переход на процедуру с помощью команды JMP, но обычной практикой является использование команды CALL для вызова процедуры и RET для выхода из процедуры.

Процедура, находящаяся в одном сегменте с вызывающей процедурой, имеет тип NEAR:

имя-процедуры PROC [NEAR]

В случае, если операнд опущен, то Ассемблер принимает значение NEAR пo умолчанию.

В случае, если процедура является внешней по отношению к вызывающему сегменту, то ее вызов может осуществляться только командой CALL, а сама процедура должна быть объявлена как PUBLIC. Более того, если в вызываемой процедуре используется другое значение ASSUME CS, то необходимо кодировать атрибут FAR:

PUBLIC имя-процедуры, имя-процедуры PROC FAR

При вызове любой процедуры с помощью команды CALL необходимо обеспечить возврат по команде RET.

Директива PUBLIC

Назначение директивы PUBLIC — информировать ассемблер, что на указанные имена имеются ссылки из других ассемблерных модулей. Формат директивы:

PUBLIC имя [,...]

Директива RECORD

Директива RECORD позволяет определять битовые строки. Одно из назначений этой директивы — определить однобитовые или многобитовые переключатели. Формат директивы:

имя RECORD имя-поля:ширина [=выражение] [,... ]

Имя директивы и имена полей могут быть любыми уникальными идентификаторами. После каждого имени поля следует двоеточие (:) и размер поля в битах, которое может быть от 1 до 16 бит.

Любой размер поля до 8 бит представляется восемью битами, а от 9 до 16 бит — представляется шестнадцатью битами, выровненными справа (если необходимо).

Дополнительно к директиве RECORD имеются операторы WIDTH, MASK и фактор сдвига. Использование этих операторов позволяет изменять определение директивы RECORD без изменения команд, которые имеют ссылки на директиву RECORD.

Оператор WIDTH

Оператор WIDTH возвращает число битов в директиве RECORD или в одном из ее полей.

Фактор сдвига

Прямая ссылка на элемент в RECORD, например:

MOV CL,BIT2

в действительности не имеет отношения к содержимому BIT2. Вместо этого Ассемблер генерирует непосредственный операнд, который содержит «фактор сдвига», помогающий изолировать необходимое поле. Непосредственное значение представляет собой число, на которое необходимо сдвинуть BIT2 для выравнивания справа.

Оператор MASK

Оператор MASK возвращает «маску» из единичных битовых значений, которые представляют специфицированное поле, иными словами, определяют битовые позиции, которые занимает поле.

Выравнивание

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

PAGE = xxx00

PARA = хххх0 (граница по умолчанию)

WORD = ххххe (четная граница)

BYTE = ххххх

где х — любая шестнадцатеричная цифра, е — четная шестнадцатеричная цифра.

Объединение

Операнд объединения указывает способ обработки сегмента, при компоновке:

NONE: Значение по умолчанию. Сегмент должен быть логически отделен от других сегментов, хотя физически он может быть смежным. Предполагается, что сегмент имеет собственный базовый адрес;

PUBLIC: Все PUBLIC-сегменты, имеющие одинаковое имя и класс, загружаются компоновщиком в смежные области. Все такие сегменты имеют один общий базовый адрес;

STACK: Для компоновщика операнд STACK аналогичен операнду PUBLIC. В любой компонуемой программе должен быть определен по крайней мере один сегмент STACK. В случае, если объявлено более одного стека, то стековый указатель (SP) устанавливается на начало первого стека;

COMMON: Для сегментов COMMON с одинаковыми именами и классами компоновщик устанавливает один общий базовый адрес. При выполнении происходит наложение второго сегмента на первый. Размер общей области определяется самым длинным сегментом;

AT-параграф: Параграф должен быть определен предварительно. Данный операнд обеспечивает определение меток и переменных по фиксированным адресам в фиксированных областях памяти, таких, как ROM или таблица векторов прерываний в младших адресах памяти.

Класс

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

Типичными примерами являются классы 'STACK' и 'CODE'.

Директива STRUC

Директива STRUC обеспечивает определение различных полей в виде структуры. Данная директива не поддерживается в малом ассемблере ASM.

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

Имя-структуры STRUC...

[определение полей данных]...

Имя-структуры ENDS

Структура начинается собственным именем в директиве STRUC и завершается таким же именем в директиве ENDS.

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

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

 

 

?


 




Поделиться с друзьями:


Дата добавления: 2017-02-01; Просмотров: 82; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.