Способы адресации памяти и устройств ввода/вывода
Команды микропроцессора 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Х.