Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка Программир на ассемблере.doc
Скачиваний:
8
Добавлен:
17.09.2019
Размер:
605.7 Кб
Скачать

4. Режимы адресации команд

Режимом адресации называется способ определения операнда. Различают следующие режимы адресации данных:

1. Непосредственный режим адресации данных - данное длиной 8 или 16 бит являются частью команды.

2. Прямой режим адресации данных - 16-битный эффективный адрес данного является частью команды.

3. Регистровый режим адресации данных - данное находится в регистре.

4. Регистровый косвенный режим адресации данных - эффективный адрес данного находится в базовом регистре BX, или индексных регистрах SI, DI.

5. Регистровый относительный режим адресации данных - эффективный адрес равен сумме 8- или 16-битного смещения и содержимого базовых индексных регистров.

6. Базовый индексный режим адресации данных - эффективный адрес равен сумме содержимого базового и индексного регистров.

7. Относительный базовый индексный режим адресации данных - эффективный адрес равен сумме 8- или 16-битного смещения, базового и индексного регистров.

5. Байт способа адресации

Первый байт машинного кода команды может содержать либо префикс замены сегментов, либо код операции. Префикс замены сегментов имеет следующий вид:

001ХХ110, где биты ХХ определяют сегмент.

Таблица 3.

Префикс замены сегмента

XX

Байт префикса замены сегмента

Сегментный регистр

00

26

ES

01

2E

CS

10

36

SS

11

3E

DS


Следовательно, если первый байт машинного кода команды не равен 26, 2Е, 36 или 3Е, то он содержит код операции и биты “d”, “w”. Бит “d” указывает направление передачи между операндом 1 и операндом 2. Если d=1, то направление в микропроцессор (в регистр из памяти или регистра). Если d=0, то направление из микропроцессора (из регистра в память или регистр). Бит “w” определяет длину операндов. Если w=1, то длина операнда - слово (два байта). Если w=0, то длина операнда - байт.

В командах с непосредственным операндом бит “d” не нужен, так как результат можно поместить только на место первого операнда. Но зато в этом формате необходимо определить размер непосредственного операнда. Для этой цели служат биты “s” и “w”, интерпретируемые следующим образом.

Таблица 4.

Размер непосредственного операнда

sw

Размер непосредственного операнда

00

один байт

01

один байт

10

два байта

11

один байт, который расширяется со знаком до 16 бит


В командах сдвига стоят биты “c” и “w”, где бит “c” определяет где находится число сдвигов. Если с=1, то число сдвигов задано в регистре CL. Если с=0, то осуществляется сдвиг на один разряд. Следующий байт команды является байтом способа адресации и состоит из следующих трех полей: mod, reg, r/m.

Значения полей mod, reg, r/m приведены в приложении. Два бита mod определяют адресацию регистра или памяти. Ниже поясняется их значение.

Таблица 5.

Значение поля mod

Значение поля mod

Адресация операнда

00

адрес ячейки памяти, смещение отсутствует

01

адрес ячейки памяти и один байт смещения, который расширяется со знаком до слова

10

адрес ячейки памяти и два байта смещения

11

регистр


Три бита reg (вместе с битом w) определяют конкретный восьми- или шестнадцатибитовый регистр.

Таблица 6.

Значение поля reg

reg

w=0

w=1

000

AL

AX

001

CL

CX

010

DL

DX

011

BL

BX

100

AH

SP

101

CH

BP

110

DH

SI

111

BH

DI

Три бита r/m (регистр/память) совместно с битами mod определяют способ адресации.

Таблица 7.

Значение поля r/m

mod

r/m

00

01

10

11

w=0 w=1

000

сегментный регистр

(BX)+(SI)

DS

(BX)+(SI)+D8

DS

(BX)+(SI)+D16

DS

AL

AX

001

сегментный регистр

(BX)+(DI)

DS

(BX)+(DI)+D8

DS

(BX)+(DI)+D16

DS

CL

CX

010

сегментный регистр

(BP)+(SI)

SS

(BP)+(SI)+D8

SS

(BP)+(SI)+D16

SS

DL

DX

011

сегментный регистр

(BP)+(DI)

SS

(BP)+(DI)+D8

SS

(BP)+(DI)+D16

SS

BL

BX

100

сегментный регистр

(SI)

DS

(SI)+D8

DS

(SI)+D16

DS

AH

SP

101

сегментный регистр

(DI)

DS

(DI)+D8

DS

(DI)+D16

DS

CH

BP

110

сегментный регистр

Data16

DS

(BP)+D8

SS

(BP)+D16

SS

DH

SI

111

сегментный регистр

(BX)

DS

(BX)+D8

DS

(BX)+D16

DS

BH

DI


Рассмотрим режимы адресации на примере команды OR (логическое “ИЛИ”). Эта команда выполняет поразрядное логическое сложение над битами двух операндов.

Объектный код данной команды имеет три формата (объектные коды команд приведены в приложении “Команды процессора 8086”):

1. Регистр/память с регистром

000010dw

MOD REG R/M

DISP LOW

DISP HIGH

2. Непосредственное значение с регистром/памятью

1000000w

MOD 001 R/M

DISP LOW

DISP HIGH

DATA

DATA, если W=1

3. Непосредственное значение с аккумулятором (регистром АХ (АL))

0000110w

DATA

DATA, если W=1

1.Непосредственный режим адресации

Пример. OR CL,OF

Логическое сложение содержимого регистра CL и непосредственного значения OF. Данному режиму адресации соответствует второй формат объектного кода (непосредственное значение с регистром). Определим байт способа адресации (W, mod, r/m) :

w=0, т.к. размер операнда - 1 байт,

mod=11, т.к. сложение с регистром, а не с памятью,

r/m=001, что соответствует регистру.

Таким образом, объектный код команды OR CL,OFH имеет вид

100000001100100100001111

или в 16-й системе счисления 80C90F.

2. Регистровый режим адресации

Пример. OR DX,CX

Логическое сложение содержимого регистров DX и CX.

Данному режиму адресации соответствует первый формат объектного кода (регистр с регистром). Определим байт способа адресации (d, W, mod, reg, r/m ) :

d=0, т.к. reg описывает операнд 2, а r/m - операнд 1,

w=1, т.к. размер операнда - слово,

mod=11, т.к. сложение с регистром, а не с памятью,

reg=001, что соответствует регистру CX,

r/m=010, что соответствует регистру.

Таким образом, объектный код команды ORCX,DX имеет вид

0000100111001010

или в 16-й системе счисления O9CA.

3. Регистровый косвенный режим

Пример. OR CL,byte ptr [BX]

Логическое сложение регистра CL с ячейкой памяти по адресу, находящемуся в BX.

Данному режиму адресации соответствует первый формат объектного кода (память с регистром).

Определим байт способа адресации (d, W, mod, reg, r/m):

d=1, т.к. reg описывает операнд 1, а r/m - операнд 2,

w=0, т.к. размер операнда - байт,

mod=00, что соответствует регистру BX,

reg=001, что соответствует регистру CL,

r/m=111, что соответствует регистру BX.

Таким образом, объектный код команды имеет вид

0000101000001111

или в 16-й системе счисления 0A0F.

4. Регистровый относительный режим адресации

Пример: OR DL,byte ptr [BX+48]

Логическое сложение содержимого регистра DL с ячейкой памяти по адресу BX+48H.

Данному режиму адресации соответствует первый формат объектного кода (регистр/память с регистром).

Определим байт способа адресации (d, W, mod, reg, r/m):

d=1, т.к. reg описывает операнд 1, а r/m - операнд 2,

w=0, т.к. размер операнда - байт,

mod=01, что соответствует BX+D8 ,

reg=010, что соответствует регистру DL ,

r/m=111, что соответствует BX+D8.

Таким образом, объектный код команды имеет вид

000010100101011101001000

или в 16-й системе счисления 0А5748.

5. Базовый индексный режим адресации

Пример: OR AX,word ptr [BP+DI]

Логическое сложение содержимого регистра AX с ячейкой памяти по адресу BP+DI.

Данному режиму адресации соответствует первый формат объектного кода.

Определим байт способа адресации :

d=1, т.к. reg описывает операнд 1, а r/m - операнд 2,

w=1, т.к. размер операнда - слово,

mod=00, что соответствует BP+DI,

reg=000, что соответствует регистру AX,

r/m=011, что соответствует BP+DI.

Таким образом, объектный код команды имеет вид

0000101100000011

или в 16-й системе счисления 0B03.

6. Относительный базовый индексный режим адресации

Пример: OR CL,byte ptr [BX+SI+0084]

Логическое сложение содержимого регистра CL с ячейкой памяти по адресу BX+SI+0084.

Данному режиму адресации соответствует первый формат объектного кода.

Определим байт способа адресации:

d=1, т.к. reg описывает операнд 1, а r/m - операнд 2,

w=0, т.к. размер операнда - байт,

mod=10, что соответствует BX+SI+D16,

reg=001, что соответствует регистру CL,

r/m=000, что соответствует BX+SI+D16.

Таким образом, объектный код команды имеет вид

00001010100010001000010000000000

или в 16-й системе счисления 0А888400.