В КОТОРОЙ ВТОРОЙ ОПЕРАНД НЕПОСРЕДСТВЕННЫЙ
ПРЯМАЯ АДРЕСАЦИЯ С БАЗИРОВАНИЕМ И ИНДЕКСИРОВАНИЕМ
АДРЕСАЦИЯ С БАЗИРОВАНИЕМ И ИНДЕКСИРОВАНИЕМ + d8
АДРЕСАЦИЯ С БАЗИРОВАНИЕМ И ИНДЕКСИРОВАНИЕМ
АДРЕСАЦИЯ ПО СУММЕ БАЗОВОГО РЕГИСТРА И СМЕЩЕНИЯ
MOV [BX+3],AL ;-> аналогично предыдущему способу
MOV BX,[BP+2]
BX:=((BP)+2); <- слово
При такой форме записи адресация по SS, т. е. осуществляется прямое обращение к стеку без использования PUSH и POP.
Задача: по значению элементов массива Х сформировать массив Y, в котором
X[i-1] + X[i+1]
Y[i] = -----------------------
i = 2,3 .. n-1
Y[1] = X[1]; Y[n] = X[n]
----------------------------------
X DW 20 DUP(?)
Y DW 20 DUP(?)
N DW ?
----------------------------------
MOV AX,AX ; Ё AX:=X[1]
MOV Y,AH ; Ё Y[1]:=X[1]
MOV CX,N
SUB CX,2
MOV SI,2 ;индекс Х[2]
ML: MOV DI,offset Y+2
MOV AX,X[SI-2] ; AX:=X[i-1]
ADD AX,X[SI+2] ; AX:=X[i-1]+X[i+1]
MOV BX,2
CWD
IDIV BX
MOV [DI],AX
ADD DI,2
ADD SI,2
DEC CX
JNZ ML
; после выхода из цикла SI указывает на Х[n], а DI - на Y[n]
MOV AX,X[SI]
MOV [DI],AX
(BX)+(DI) = EA
(BP)+(DI) = EA
MOV [BX+SI],AL – одинаковые команды
MOV [BX][SI],AL
d w mod reg r/m
┌───────┬───┬───┐ ┌───┬───┬───┐ команда двухбайтная т. к. нет
│ KOП │ 0 │ 0 │ │ 00│000│000│ смещения
└───────┴───┴───┘ └───┴───┴───┘
Пример использования такой команды – обработка матриц.
A DB 5 DUP(?)
M DW 3 ; число строк
N DW 5 ; число столбцов
; ┌───┬───┬───┬───┬───┐
; │A11│A12│A13│A14│A15│>┐ Пусть BX содержит начальный
; └───┴───┴───┴───┴───┘ │ адрес поля А
; ┌───────────────────────┘
; │ ┌───┬───┬───┬───┬───┐
; └>│A21│A22│A23│A24│A25│>┐
; └───┴───┴───┴───┴───┘ │;
; ┌───────────────────────┘
; │ ┌───┬───┬───┬───┬───┐
; └>│A31│A32│A33│A34│A35│
; └───┴───┴───┴───┴───┘
MOV BX,offset A
;В дальнейшем BX будем использовать для адресации строк. В
;исходном состоянии BX указывает одновременно на 1-ю строку
;Дельта BX = m * size(A)
;Начальное значение SI = 0
SUB SI,SI
;SI указывает на текущий элемент строки
;Дельта SI = size(A)
;Условно BX соответствует индексу i, а SI - j
Команды MOV [BP+SI],BL
MOV AX,[BP+SI]
выполняются аналогично, но адресуются в стек.
MOV [BX+SI-1],AL
┌───┬───┬───┬───┬───┐
│A11│A12│A13│A14│A15│>┐ Пусть [BX+SI] указывает на элемент
└───┴───┴───┴───┴───┘ │ А22, тогда [BX+SI-1] указывает на
┌───────────────────────┘ элемент А21
│ ┌───┬───┬───┬───┬───┐
└>│A21│A22│A23│A24│A25│>┐ Диапазон d8 -> -128..127
└───┴───┴───┴───┴───┘ │;
┌───────────────────────┘
│ ┌───┬───┬───┬───┬───┐
└>│A31│A32│A33│A34│A35│
└───┴───┴───┴───┴───┘
MOV [BX+SI-1],AL
d w mod reg r/m DISPL
┌───────┬───┬───┐ ┌───┬───┬───┐ ┌────┐
│ KOП │ 0 │ 0 │ │ 01│000│000│ │ FF │
└───────┴───┴───┘ └───┴───┴───┘ └────┘
EA = (BX) + (SI) + DISPL
(BX)+(SI)+d8(16) \ работают с DS
(BX)+(DI)+d8(16) /
(BP)+(SI)+d8(16) \ работают с SS
(BP)+(DI)+d8(16) /
r/m │ mod = 01
│ mod = 10
─────┼────────────────
000 │ (BX)+(SI)+d8(16)
001 │ (BX)+(DI)+d8(16)
010 │ (BP)+(SI)+d8(16)
011 │ (BP)+(DI)+d8(16)
Данный способ адресации позволяет проводить эффективную обработку двумерных массивов.
┌───┬───┬───┬───┬───┐ А – прямой адрес матрицы или
; │A11│A12│A13│A14│A15│>┐ адрес первого элемента
; └───┴───┴───┴───┴───┘ │ BX – смешение строк матрицы
; ┌───────────────────────┘
; │ ┌───┬───┬───┬───┬───┐
; └>│A21│A22│A23│A24│A25│>┐
; └───┴───┴───┴───┴───┘ │;
; ┌───────────────────────┘
; │ ┌───┬───┬───┬───┬───┐
; └>│A31│A32│A33│A34│A35│
; └───┴───┴───┴───┴───┘
MOV BX,0 ;первая строка
;Дельта BX = m * size(A) - нашем случае - 1 байт
;SI - смещение элементов внутри строки
MOV si,0 ; -> текущий элемент в строке
;Дельта SI = size(A) - нашем случае - 1 байт
;EA = (базовый адрес А) + (BX) + (SI)
ДВУХОПЕРАНДНАЯ КОМАНДА,
7 0 7 0
┌───────┬──┬─┐ ┌───┬────┬─────┐ ┌ ─ ─ ─┐ ┌ ─ ─ ┐ ┌─────┐ ┌ ─ ─ ┐
│ KOP │S │W│ │mod│ kop│ r/m │ dispL dispH │dataL│ dataH
└───────┴──┴─┘ └───┴────┴─────┘ └ ─ ─ ─┘ └ ─ ─ ┘ └─────┘ └ ─ ─ ┘
Бит направления d в данной команде не нужен, т. к. результат помещается только на место первого операнда. Поэтому биты s,w определяют формат второго операнда.
┌──
│ *0, один байт данных dataL
sw=│ 01, два байта данных dataL dataH
│ 11, один байт данных, при выполнении команды расширяется до слова
└──
Add bx,5h
│ └────────────────┐
└─────────┐ │
┌──────┬─┬─┐ ┌──┬─────┬───┐ ┌─────┐
│ kop │0│1│ │11│ кор │011│ │00 05│
└──┬───┴─┴─┘ └──┴──┬──┴───┘ └──┴──┘
│ s w mod │ r/m data
└───────┬────────┘
код операции
Предположим, что А имеет размерность byte, тогда:
Sub A[BX+SI],-8 – НО с базированием и индексированием
┌──────┬─┬─┐ ┌──┬─────┬───┐ ┌─────────────┐ ┌──┐
│ kop │0│0│ │10│ кор │000│ │ пр. адрес А │ │F8│
└──────┴─┴─┘ └──┴─────┴───┘ └──────┴──────┘ └──┘
disp dataL