- •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.10. Способы адресации операндов
При выполнении программы МП многократно обращается к памяти за командами и операндами. Положение любой ячейки характеризуется ее полным логическим адресом segment:offset. В качестве сегментного компонента segment используется содержимое соответствующего сегментного регистра, а внутрисегментное смещение offset в общем случае может формироваться различным образом. Часто оно берется из регистров, но может и вычисляться по некоторому закону.
Внутрисегментное смещение offset, используемое для обращения к памяти, называется эффективным или исполнительным адресом EA. Эффективный адрес формируется в соответствии с используемым способом адресации операнда. Способ адресации определяется формой записи операнда. Поскольку существуют двухоперандные команды, то в одной команде могут использоваться два различных способа адресации.
При любом способе адресации значение, участвующее в операции, представляет собой содержимое указанного операнда.
3.10.1. Адресация данных
МП ВМ86/ВМ88 реализует разнообразные способы адресации, позволяющие эффективно обрабатывать и простые, и сложные структуры данных.
Регистровая адресация
В этом случае операнд находится в одном из регистров МП и записывается путем указания имени регистра REG.
Пример 3.30:
MOV AX, BX ; Пересылка (BX) в (AX)
MOV DS, AX ; Пересылка (AX) в (DS)
Здесь и далее обозначение элемента архитектуры в круглых скобках соответствует содержимому этого элемента.
Команды с регистровой адресацией являются наиболее короткими и выполняются за минимальное время.
Непосредственная адресация
В этом случае операнд представляет собой числовую или символьную константу Data, записываемую непосредственно в команде.
Пример 3.31:
MOV AX, 328 ;Загрузка в AX числа 328
MOV DX 'MП' ;Загрузка в DX символов 'МП'
MOV DS, 100 ;Ошибканепосредственная загрузка ;в сегментные регистры недопустима
Доступ к непосредственным операндам осуществляется очень быстро, так как они выбираются из внутренней очереди команд.
Прямая адресация
Прямая адресация является простейшим способом адресации памяти. В этом случае операнд записывается прямо в команде в виде имени переменной NameVar (в общем случае в виде адресного выражения). При этом эффективный адрес EA = offset NameVar.
Пример 3.32:
MOV AL, Source ;Загрузка переменной Source в AL
MOV Dest+10, AX ;Запись (AX) в слово, отстоящее от ;переменной Dest на 10 байтов.
Прямая адресация используется для обращения к простым переменным.
Косвенная регистровая адресация
Источником косвенного адреса могут служить только базовые регистры BREG (BX,BP) или индексные регистры IREG (SI,DI). В этом случае операнд записывается в виде имени регистраисточника адреса в квадратных скобках [BREG] или [IREG], а именно: [BX], [BP], [SI], [DI]. При этом эффективный адрес EA=(BX), (BP), (SI) или (DI) соответственно.
Пример 3.33:
MOV AX, [BX] ;Загрузка слова из ячейки, адресуемой (BX)
MOV [SI], AL ;Запись байта в ячейку, адресуемую (SI).
Косвенная адресация по ячейке памяти отсутствует, но может быть легко реализована при необходимости.
Пример 3.34:
MOV SI, Addr ;Косвенная адресация
MOV AX, [SI] ;по ячейке Addr
Косвенная адресация используется при циклической организации программ, в которых за счет модификации косвенного адреса с помощью одной и той же команды осуществляется обращение к различным элементам данных.
В более сложных способах адресации в описании операндов, как правило, имеется некоторая константа, которая может задаваться различным образом. Она включается в машинный код команды и используется при вычислении эффективного адреса. Эта константа интерпретируется как число со знаком и вносит смещение относительно эффективного адреса, определяемого другими компонентами описания операнда.
Смещение, содержащееся в команде, принято называть смещением displacement или disp. Смещение disp определяется автоматически по описанию операнда в процессе трансляции программы и может принимать 8- или 16-битные значения.