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

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-битные значения.