Скачиваний:
27
Добавлен:
15.06.2014
Размер:
34.3 Кб
Скачать

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

Директива 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 должен содержать правильное значение сегментного

адреса.

Директива 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

Директива PUBLIC

Назначение директивы PUBLIC - информировать ассемблер, что на указанные

имена имеются ссылки из других ассемблерных модулей. Формат директивы:

PUBLIC имя [,...]

Директива SEGMENT

Ассемблерный модуль может состоять из одного или более сегментов,

части сегмента или даже частей нескольких сегментов. Формат директивы:

имя_сегмента SEGMENT [выравнивание] [объединение] [класс]

.

.

.

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

Все операнды являются необязательными. Ниже описаны операнды для

выравнивания, объединения и указания класса.

В ы р а в н и в а н и е. Операнд выравнивания определяет начальную

границу сегмента, например

PAGE = xxx00

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

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

BYTE = ххххх

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

е - четная шестнадцатиричная цифра.

О б ъ е д и н е н и е. Операнд объединения указывает способ обработки

сегмента, при компоновке:

NONE: Значение по умолчанию. Сегмент должен быть логически отделен от

других сегментов, хотя физически он может быть смежным.

Предполагается, что сегмент имеет собственный базовый адрес;

PUBLIC: Все PUBLIC - сегменты, имеющие одинаковое имя и класс,

загружаются компоновщиком в смежные области. Все такие сегменты имеют

один общий базовый адрес;

STACK: Для компоновщика операнд STACK аналогичен операнду PUBLIC. В

любой компонуемой программе должен быть определен по крайней мере

один сегмент STACK. Если объявлено более одного стека, то стековый

указатель (SP) устанавливается на начало первого стека;

COMMON: Для сегментов COMMON с одинаковыми именами и классами

компоновщик устанавливает один общий базовый адрес. При выполнении

происходит наложение второго сегмента на первый. Размер общей области

определяется самым длинным сегментом;

AT-параграф: Параграф должен быть определен предварительно. Данный

операнд обеспечивает определение меток и переменных по фиксированным

адресам в фиксированных областях памяти, таких, как ROM или таблица

векторов прерываний в младших адресах памяти. Например, для

определения адреса дисплейного видеобуфера используется

VIDEO_RAM SEGMENT AT 0B800H

Класс: Операнд класс может содержать любое правильное имя,

заключенное в одиночные кавычки. Данный операнд используется

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

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

Следующие два сегмента объединяются компоновщиком в один физический

сегмент при одном значении сегментного регистра:

Ассемблерный SEG1 SEGMENT PARA PUBLIC 'CODE'

модуль 1 ASSUME CS:SEG1

...

SEG1 ENDS

Ассемблерный SEG2 SEGMENT PARA PUBLIC 'CODE'

модуль 2 ASSUME CS:SEG1

...

SEG2 ENDS

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

Сегменты могут быть вложенными один в другой:

SEG1 SEGMENT

... Начало SEG1

SEG2 SEGMENT

... Область SEG2

SEG2 ENDS

... Конец SEG1

SEG1 ENDS

Для объединения сегментов в группы используйте директиву GROUP.

Соседние файлы в папке Ответы на билеты