Способы адресации памяти и устройств ввода/вывода

Команды микропроцессора Intel 8086 реализуют разнообразные способы адресации, что упрощает организацию и использование сложных структур данных, а также расширяет возможности отдельных команд и повышает гибкость их применения.

1. Регистровая адресация. Операнд находится в одном из общих регистров МП, а в некоторых командах в одном из сегментных регистров.

Примеры:

MOV AX, SI ; <SI>®<AX>

ADD DI, BX ; <BX>+<DI>

AND CL, AX ; Ошибка, несоответствия размеров регистров

XOR AL, AH ; XOR <AL> и <AH>.

2. Непосредственная адресация. Операнды представляют собой константы длиной 8 или 16 бит, содержащиеся в командах. В МП нет команд непосредственной загрузки регистров.

SUB AL, 30H ; <AL>- 48 (30H = 48D)

MOV CL, 10 ; (10®<CL>)

AND AX, 0F000H ; Выделить старших 4 бита в AX

XOR DH, 1 ; Инвертировать младший бит в DH

CMP BL,40H ; Сравнить содержимое BL с числом 64.

3. Прямая адресация. Эффективный адрес берется из поля смещения команды:

MOV AX, GAMMA ; В Акк АХ загружено содержимое ячеек памяти

; с адресом, полученным суммированием

; <DS> сдвинутого на 4 разряда с адресом

; переменной GAMMA, определенном в ячейке программы.

ADD TEMP, BL ; <BL>+ <<DS>­4+TEMP>

4. Косвенная регистровая. Эффективный адрес (ЕА) находится в одном из базовых или индексных регистров. В косвенной адресации могут использоваться только регистры ВХ, SI, DI. Косвенные регистровые операнды заключают в квадратные скобки.

ADD AX, [DI] ; К <AX> прибавляется содержимое ячейки памяти,

; адрес который находится в DI.

; исполнительный адрес: <DS>­4+ <DI>.

MOV [SI], CL ; <<SI>> < CL>

5. Базовая адресация (база + смещение). ЕА определяется суммой значения смещения, указанного в команде и содержимого регистров ВХ или ВР.

К операциям в памяти можно адресовать, указывая прямой адрес, т.е. называя имя соответствующей области памяти, либо косвенные - через регистры-указатели, или индексные регистры. При прямой адресации 16-ричное смещение автоматически складывается с базовым адресом соответствующего сегмента. При косвенном обращении участвуют один или два из четырех регистров. Они указываются в квадратных скобках [ ] – признак косвенной адресации ВХ, ВР, SI, DI. Если указывается переменная, за ее именем следует выражение в квадратных скобках, которое задает базовые или индексные регистры.

В случае косвенной адресации может быть указан либо только базовый регистр, либо только индексный, либо оба регистра и может быть также указано 8 или 16-битовое смещение.

MOV AX, [BX] ; переслать слово из памяти в АХ. Слово находится в сегменте

; данных, адрес этого сегмента в регистре DS, смещение

; относительно этого адреса в регистре ВХ.

К операндам, находящимся в памяти, можно обратиться одним из четырех способов:

Указанием прямого 16-разрядного смещения

MOV REPORT, AL ;в байт памяти с именем REPORT пересылается содержимое AL

; ([DS]­4+[REPORT])®AL

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

MOV ON[BX+2], AL

MOV BL, ON[BP]

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

MOV CL, ITEM[SI+1]

MOV ON[DI+1], CL

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

MOV AH, ITEM[BX+1] [SI+1]

MOV ON[BX+1][DI+1]

При определении ВР в качестве базового регистр обращение осуществляется к текущему сегменту стека SS (если нет префикса замены сегмента). Это делает базовую адресацию с регистром ВР очень удобным средством обращения к данных, находящимся в стеке. Обычно базовый регистр BREG указывает на начало структуры данных, а требуемый элемент адресуется с помощью смещения (расстояния) от базы.

Для обозначения базовой адресации используют два представления:

1) [BREG] DISP BREG – базовый регистр (ВХ или ВР)

2) [BREG+ DISP]

Пример записи команд с базовой адресацией:

MOV AX, [BP]10 ; Обе команды передают шестое слово массива, адресуемое ВР,

MOV AX, [BP+10] ; в Аккумулятор,

ADD [BX]TEMP,CX ; Прибавить <СХ> к слову ТЕМР в массиве, адресуемом ВХ.

6. Индексная адресация (смещенная база + индекс). Этот вид адресации называют адресацией с индексированием. Эффективный адрес вычисляется как сумма смещения, находящегося в команде, и содержимого индексного регистра DI или SI. Адресация удобна при доступе к элементам таблицы (массива), когда смещение указывает на начало таблицы (массива), а индекс – на элементы в таблице (массиве). По существу индексная и базовая адресация в МП К1810 аналогичны. Это объясняется тем, что базовые и индексные регистры имеют одинаковую длину. Индексная адресация обозначается в виде TABL[IREG]. Здесь TABL – 16-битовое смещение (адрес начала таблицы).

Примеры:

MOV ADRM [SI], AX ; Передать <АХ> в элемент массива с начальным

; адресом ADRM

ADD CX, MASS [DI] ; Прибавить к <СХ> элемент массива.

; MASS – смещение, указанное в команде.

Пример: Загрузить 3-й элемент массива в аккумулятор АL.

table DB 10, 20, 30, 40

MOV DI, 2 ; загрузить в индексный регистр номер выбираемого байта

; минус 1 (т.к. массив начинается с нулевого элемента)

MOV AL, TABLE [DI] ; загрузить 3-й байт таблицы в AL.

Примеры записи базового индекса адресации:

MOV AX, [BX+2+DI] ; Операнды можно заключать в скобки

MOV AX, [DI+BX+2] ; в любом порядке, а сдвиг можно

MOV AX, [BX+2][DI] ; сочетать с любым из регистров

MOV AX, [BX][DI+2]

7. Базово-индексная адресация (по базе с индексированием). Эффективный адрес равен сумме содержимого базового регистра, индексного регистра и, возможно, смещения, указанного в команде. Этот способ целесообразно использовать при работе с двумерными таблицами. В этом случае базовый регистр содержит начальный адрес массива, а значения смещения и индексного регистра является смещением по строке и столбцу. В ассемблере МП 1810ВМ86 базово-индексная адресация представляется в виде: [BREG]АDR16[IREG].

Пример: загрузить в АХ 16-разрядный элемент таблицы, состоящей из 4-х столбцов и 3-х строк, находящийся в третьей строке на третьей позиции (3,3) [а22, если в таблице считать 0-й столбец и 0-ю строку].

TABLE DW 1024, 1048, 2048, 3600 ; Задание таблицы в начале ассемблерной

DW 4100, 5000, 600, 2000 ; программы

DW 80, 300, 4000, 5000 ;

VALUE DB 2 ; указание номера элемента в строке минус 1 (т.к. считается с 0).

……………………..

MOV BX, TABLE ; в базовый регистр ВХ заносится начальный адрес таблицы

MOV DI, 16 ; в индексный регистр DI заносится смещение в байтах (ячейка

; памяти) адреса начала третьей строки от начала таблицы.

MOV AX, VALUE [BX][ DI] ; загрузка элемента (а22)=4000 в АХ.

8. Относительная адресация. Эффективный адрес вычисляется как сумма фиксированного смещения, находящегося в команде и текущего значения программного счетчика РС. При этом значение РС равно адресу байта, следующего за текущей командой. В МП К1810 относительная адресация применяется только в командах условных и безусловных переходов, вызова подпрограмм и управления итерациями (или циклами). Следует отметить, что программист в ассемблерных программах указывает не значение смещения, а абсолютный адрес перехода, т.е. метку команды, которой необходимо передать управление. Значение смещения выполняется автоматически программа - ассемблер.

9. Адресация цепочек. Для обращения к операциям цепочечных команд, используются индексныерегистры. Регистр SI адресует первый байт (слово) цепочки источника, а регистр DI – первый байт (слово) цепочки получателя. В повторяющихся цепочных операциях МП автоматически изменяет содержимое регистров SI и DI.

10. Адресация портов ввода-вывода.Существует прямая и косвенная адресация портов. В прямой адресации номер порта представляет собой 8-битовый непосредственный операнд, находящийся во втором байте команды, что обеспечивает обращение к фиксированным портам 0-255.

При косвенной адресации номер порта находится в регистре DХ и имеет диапазон 0-65535. С помощью предварительной инициализации регистра DХ одна и та же команда может обращаться к любому порту в адресном пространстве ввода-вывода.

Примеры:

IN AL, 40H ; Ввод байта из порта номер 40Н

OUT DX, AX ; Вывод слова в порт с адресом, хранящемся в DХ

IN AX, DX ; Ввод слова из устройства, адрес которого хранится в DХ.

Наши рекомендации