Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные системы (книга Комаров) / Программирование на Ассемблере (ч 1).doc
Скачиваний:
148
Добавлен:
08.03.2015
Размер:
435.2 Кб
Скачать

3.8. Атрибуты переменных и меток. Директивы, возвращающие атрибутные значения

3.8.1. Атрибуты переменных

Любая простая переменная имеет три атрибута: "Сегмент", "Смещение" и "Тип".

Атрибут "Сегмент" представляет собой базовый адрес логического сегмента, в котором описана переменная, и может принимать значение из диапазона 0...FFFFh.

Атрибут "Смещение" представляет собой расстояние в байтах от начала логического сегмента до переменной и может иметь значение в диапазоне 0...FFFFh.

Атрибут "Тип" характеризует длину переменной в байтах и для стандартных переменных может иметь значения 1 (для типа BYTE), 2 (для типа WORD), 4 (для типаDWORD) и т.д.

Массивы имеют два дополнительных атрибута: "Длина" и "Размер".

Атрибут "Длина" характеризует количество элементов в массиве, независимо от их типа.

Атрибут "Размер" характеризует размер массива в байтах.

Очевидно, что для одного и того же массива справедливо соотношение "Размер"="Длина""Тип".

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

SEGвозвращает атрибут "Сегмент";

OFFSETвозвращает атрибут "Смещение";

TYPE возвращает атрибут "Тип";

LENGTHвозвращает атрибут "Длина";

SIZEвозвращает атрибут "Размер".

Пример 3.19:

Если сегмент Data, начинающийся с физического адреса 05000h, имеет вид:

Data SEGMENT

Alpha DB?

Beta DD ?

Gamma DW100DUP (?)

Data ENDS,

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

SEGAlpha =SEGBeta =SEGGamma = 500h;

OFFSETAlpha = 0,OFFSETBeta = 1,OFFSETGamma = 5;

TYPE Alpha = 1,TYPEBeta = 4,TYPEGamma = 2;

LENGTH Gamma = 100;

SIZEGamma = 200.

Следует помнить, что директива LENGTHвсегда возвращает коэффициент повторений при оператореDUP, использованный при описании массива. Во всех остальных случаях она возвращает значение 1 без сообщения об ошибке.

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

Пример3.20:

Str DB"Введите исходные данные" ;Описание строки

EndStr DB? ;Пометка конца строки

LengthStr = OFFSETEndStrOFFSETStr ;Определение длины ;строки

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

Пример 3.21:

Вычислить сумму элементов массива:

Array DW100DUP(?) ;Описание массива слов

. . . . . . . . . . .

MOV AX,SEG Array ;Загрузка полного

MOV DS, AX ;адреса массива

MOV BX,OFFSETArray

MOV CX,LENGTHArray ;Загрузка счетчика циклов

SUB AX, AX ;Обнуление накопителя

Next: ADD AX, [BX] ;Прибавление очередного;элемента

ADD BX, TYPEArray ;Модификация адреса

DEC CX ;Модификация счетчика ;циклов

JNZ Next ;Продолжить, если не все

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

3.8.2. Атрибуты меток

Метка представляет собой имя ячейки программной памяти и используется в качестве операнда команд передачи управления. Любая метка имеет три атрибута: "Сегмент", "Смещение" и "Дистанция".

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

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

Если метка достижима из диапазона от (128) до (+127) байтов от текущей точки программы, то она имеет типSHORT(короткий переход). В этом случае для представления дистанции в команде перехода достаточно одного байта.

Если метка достижима из диапазона от (32768) до (+32767) байтов, то она имеет типNEAR(ближний переход). В этом случае для представления дистанции необходимы два байта, и управление может передаваться в пределах всего сегмента. При таком переходе модифицируется только указатель команд IP. По умолчанию любая метка имеет типNEAR.

Если метка достижима из другого сегмента программного кода, то она имеет тип FAR(дальний переход). В этом случае в команде перехода адрес точки назначения задается ее полным логическим адресом в формате segment:offset, а не дистанцией. При таком переходе модифицируются регистры CS и IP.

Значение атрибута "Дистанция" может быть получено с помощью директивы TYPE. При этом для меток типаSHORTиNEARвозвращается значение (1), а для меток типаFAR(2).