Байт 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. И в том, и в другом случае используемый по умолчанию сегментный регистр может быть изменён с помощью префикса замены сегмента, входящего в состав кода команды.