- •3.Программирование на языке ассемблера
- •3.1. Архитектура микропроцессоров k1810вм86/k1810вм88
- •3.2. Основные элементы ассемблера. Формат программной строки
- •3.3. Директивы управления сегментами
- •3.4. Типовая структура текста программы
- •3.5. Символические имена
- •3.6. Константы. Их типы и директивы описания
- •3.6.1. Числовые константы
- •3.6.2. Символьные константы
- •3.6.3. Поименованные константы
- •3.6.4. Константы-выражения
- •3.7. Переменные. Их типы и директивы описания
- •3.7.1. Стандартные типы данных и их размещение в памяти
- •3.7.2. Директивы описания переменных и распределения памяти
- •3.8. Атрибуты переменных и меток. Директивы, возвращающие атрибутные значения
- •3.8.1. Атрибуты переменных
- •3.8.2. Атрибуты меток
- •3.9. Замена атрибутов переменных и меток
- •3.9.1. Замена смещения
- •3.9.2. Замена сегмента
- •3.9.3. Замена типа
- •3.10. Способы адресации операндов
- •3.10.1. Адресация данных
- •Регистровая адресация
- •Непосредственная адресация
- •Прямая адресация
- •Косвенная регистровая адресация
- •Базовая адресация
- •Индексная адресация
- •Базово-индексная адресация
- •Относительная базовоиндексная адресация
- •3.10.2. Адресация переходов
- •Внутрисегментный прямой переход
- •Внутрисегментный косвенный переход
- •Межсегментный прямой переход
- •Межсегментный косвенный переход
- •3.11. Система команд
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 = OFFSETEndStrOFFSETStr ;Определение длины ;строки
Использование директив, возвращающих атрибутные значения, позволяет писать программы в значительной степени инвариантные к обрабатываемым данным.
Пример 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).