В КОТОРОЙ ВТОРОЙ ОПЕРАНД НЕПОСРЕДСТВЕННЫЙ


ПРЯМАЯ АДРЕСАЦИЯ С БАЗИРОВАНИЕМ И ИНДЕКСИРОВАНИЕМ

АДРЕСАЦИЯ С БАЗИРОВАНИЕМ И ИНДЕКСИРОВАНИЕМ + 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