Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОНСПЕКТ ЛЕКЦИЙ ПО АССЕМБЛЕРУ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
471.55 Кб
Скачать

Прямая адресация с базированием и индексированием

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 определяют формат второго операнда. Поле reg в постбайте используется для расширения кода операции

┌──

│ *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

Формат двухоперандных команд с акумулятором и но

Аккумулятор целесообразно использовать чаще при записи программы, т. к. для него реализован специальный укороченный формат без post-байта

┌───────┬─┐ ┌─────┐ ┌ ─ ─ ┐

│ KOP │W│ │dataL│ dataH

└───────┴─┘ └─────┘ └ ─ ─ ┘

Mov AL,5h

┌───────┬─┐ ┌────┐

│ KOP │0│ │ 05 │

└───────┴─┘ └────┘

w

Этот формат работает для AL и AX. Аккумулятор подразумевается по умолчанию.

w = 0 -> AL

w = 1 -> AX

В самой команде код регистра отсутствует:

Sub AX,-1

└┬──────┘ │

┌───────┬─┐ ┌─────┐

│ KOP │1│ │FF FF│

└───────┴─┘ └──┴──┘

w data

Все двухоперандные команды имеют по 3 формата:

1) Add mem/reg,mem/reg

2) Add mem/reg,data ;используется постбайт и непосредственный операнд

3) Add AC,data ;AC – аккумулятор и непосредственный операнд без постбайта

------------------------------------------------------------

В однооперандных командах типа умножения и деления используется один формат:

Imul mem/reg

Второй и третий форматы не используются, т. к. умножение на константу не предусмотрено.