Описание процессора i8086 для программиста

       

Байт ModRegR/M


Основное назначение байта ModRegR/M – определять операнды, явно задаваемые в данной команде. Он состоит из трёх полей и имеет следующую структуру:

----T---T---T---T---T---T---T---¬

¦ M o d ¦   R e g   ¦   R / M   ¦

L---+---+---+---+---+---+---+----

7   6   5   4   3   2   1   0

Поле Mod определяет местоположение одного из операндов инструкции – в регистре или в памяти; в последнем случае совместно с полем R/M оно определяет способ вычисления эффективного адреса операнда (см. параграф “Операнды в памяти” подраздела 2.4.1 “Адресация операндов”).

Поле Reg либо указывает регистр, являющийся операндом инструкции, либо является расширением кода операции. Как номер регистра-операнда поле Reg используется только в инструкциях вида “регистр–регистр” или “регистр–память”; в инструкциях вида “регистр–непосредственный операнд”, а также в инструкциях, имеющих только один явно заданный операнд, это поле является частью кода операции.

Поле R/M содержит либо номер регистра–операнда инструкции, либо совместно с полем Mod определяет способ вычисления эффективного адреса операнда, находящегося в памяти. Интерпретация поля R/M зависит от содержимого поля Mod.

Кодировка регистров общего назначения в полях Reg и R/M осуществляется следующим образом:

– AX или AL – 000;

– CX или CL – 001;

– DX или DL – 010;

– BX или BL – 011;



– SP или AH – 100;

– BP или CH – 101;

– SI или DH – 110;

– DI или BH – 111.

Разрядность используемого регистра (8- или 16-разрядный) определяется кодом операции.

Местоположение операнда

определяется полями Mod и R/M следующим образом.

R/M

Mod

00

01

10

11

000

[BX+SI]

[BX+SI]+disp8

[BX+SI]+disp16

AX/AL

001

[BX+DI]

[BX+DI]+disp8

[BX+DI]+disp16

CX/CL

010

[BP+SI]

[BP+SI]+disp8

[BP+SI]+disp16

DX/DL

011

[BP+DI]

[BP+DI]+disp8

[BP+DI]+disp16

BX/BL

100

[SI]

[SI]+disp8

[SI]+disp16

SP/AH

101

[DI]

[DI]+disp8

[DI]+disp16

BP/CH

110

disp16

[BP]+disp8

[BP]+disp16

SI/DH

111

[BX]

[BX]+disp8

[BX]+disp16

DI/BH

<
Если поле Mod содержит значение 11, поле R/M определяет регистр общего назначения, являющийся операндом инструкции. Разрядность регистра зависит от разрядности выполняемой инструкции и определяется кодом операции.

Значения поля Mod, равные 00, 01 и 10, определяют операнд в памяти. Значение 00 указывает, что при вычислении эффективного адреса операнда отклонение не используется; значение 01 указывает, что используется 8-разрядное отклонение, находящееся в байте, следующем за байтом ModRegR/M; значение 10 указывает, что используется 16-разрядное отклонение, записанное в двух байтах, следующих за байтом ModRegR/M, в обычном порядке (“младший–старший”).

Поле R/M для случая операнда в памяти определяет, содержимое каких регистров общего назначения будет использоваться при вычислении эффективного адреса операнда.

Комбинация Mod=00 и R/M=110 является исключением из общего правила: эффективный адрес операнда равен 16-разрядному отклонению, следующему в коде команды непосредственно за байтом ModRegR/M; содержимое регистров общего назначения в формировании эффективного адреса для этого случая не используется.

Когда в состав эффективного адреса входит содержимое регистра BP, для формирования физического адреса операнда используется селектор сегмента стека, находящийся в регистре SS. Если же при вычислении эффективного адреса регистр BP не используется, физический адрес формируется с помощью селектора сегмента данных их регистра DS. И в том, и в другом случае используемый по умолчанию сегментный регистр может быть изменён с помощью префикса замены сегмента, входящего в состав кода команды.


Содержание раздела