Первый байт машинного кода команды может содержать либо префикс замены сегментов, либо код операции. Префикс замены сегментов имеет следующий вид:
001ХХ110, где биты ХХ определяют сегмент.
Таблица 3.
Префикс замены сегмента
XX
Байт префикса замены сегмента
Сегментный регистр
ES
2E
CS
SS
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
Размер непосредственного операнда
один байт
один байт
два байта
один байт, который расширяется со знаком до 16 бит
В командах сдвига стоят биты “c” и “w”, где бит “c” определяет где находится число сдвигов. Если с=1, то число сдвигов задано в регистре CL. Если с=0, то осуществляется сдвиг на один разряд. Следующий байт команды является байтом способа адресации и состоит из следующих трех полей: mod, reg, r/m.
Значения полей mod, reg, r/m приведены в приложении. Два бита mod определяют адресацию регистра или памяти. Ниже поясняется их значение.
Таблица 5.
Значение поля mod
Значение поля mod
Адресация операнда
адрес ячейки памяти, смещение отсутствует
адрес ячейки памяти и один байт смещения, который расширяется со знаком до слова
адрес ячейки памяти и два байта смещения
регистр
Три бита reg (вместе с битом w) определяют конкретный восьми- или шестнадцатибитовый регистр.
Таблица 6.
Значение поля reg
reg
w=0
w=1
AL
AX
CL
CX
DL
DX
BL
BX
AH
SP
CH
BP
DH
SI
BH
DI
Три бита r/m (регистр/память) совместно с битами mod определяют способ адресации.
Таблица 7.
Значение поля r/m
mod
r/m
w=0 w=1
сегментный регистр
(BX)+(SI)
DS
(BX)+(SI)+D8
DS
(BX)+(SI)+D16
DS
AL
AX
сегментный регистр
(BX)+(DI)
DS
(BX)+(DI)+D8
DS
(BX)+(DI)+D16
DS
CL
CX
сегментный регистр
(BP)+(SI)
SS
(BP)+(SI)+D8
SS
(BP)+(SI)+D16
SS
DL
DX
сегментный регистр
(BP)+(DI)
SS
(BP)+(DI)+D8
SS
(BP)+(DI)+D16
SS
BL
BX
сегментный регистр
(SI)
DS
(SI)+D8
DS
(SI)+D16
DS
AH
SP
сегментный регистр
(DI)
DS
(DI)+D8
DS
(DI)+D16
DS
CH
BP
сегментный регистр
Data16
DS
(BP)+D8
SS
(BP)+D16
SS
DH
SI
сегментный регистр
(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 имеет вид
или в 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 имеет вид
или в 16-й системе счисления O9CA.
3. Регистровый косвенный режим
Пример. OR CL,byte ptr [BX]
Логическое сложение регистра CL с ячейкой памяти по адресу, находящемуся в BX.
Данному режиму адресации соответствует первый формат объектного кода (память с регистром).