Регистр
|
Код
|
AX или AL
|
000
|
CX или CL
|
001
|
DX или DL
|
010
|
BX или BL
|
011
|
SP или AH
|
100
|
BP или CH
|
101
|
SI или DH
|
110
|
DI или BH
|
111
|
Значение 00 указывает, что при вычислении исполнительного адреса операнда отклонение не используется. Значение 01 указывает, что используется 8-разрядное отклонение, находящееся в байте, следующем за байтом ModRegR/M. Значение 10 указывает, что используется 16-разрядное отклонение, записанное в двух байтах, следующих за байтом ModRegR/M.
Табл. 3. Коды поля ModRegR/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
|
Поле R/M для случая операнда в памяти определяет, содержимое каких регистров общего назначения будет использоваться при вычислении исполнительного адреса операнда. Комбинация Mod=00 и R/M=110 является исключением из общего правила: исполнительный адрес операнда равен 16-разрядному отклонению, следующему в коде команды непосредственно за байтом ModRegR/M. Содержимое регистров общего назначения в формировании исполнительного адреса для этого случая не используется.
Когда в состав исполнительного адреса входит содержимое регистра BP, для формирования адреса операнда используется сегмент стека, находящийся в регистре SS. Если при вычислении адреса регистр BP не используется, физический адрес формируется с помощью сегмента данных из регистра DS. В любом случае используемый по умолчанию сегментный регистр может быть изменён с помощью префикса замены сегмента, входящего в состав кода команды.
Байт масштаб-индекс-база SIB используется для расширения возможностей адресации операндов. На наличие байта SIB в машинной команде указывает сочетание одного из значений 01 или 10 поля Mod и значения поля R/M = 100. Байт SIB состоит из трех полей (рис. 15):
В поле масштаба SS размещается масштабный множитель для индексного компонента Index, занимающего следующие три бита байта. В поле может находиться числа, кратные степени двойки. При вычислении исполнительного адреса на это значение умножается содержимое индексного регистра.
Поле Index используется для хранения номера индексного регистра, который используется для вычисления исполнительного адреса операнда.
Поле Base используется для хранения номера базового регистра, который также применяется для вычисления исполнительного адреса операнда. В качестве базового и индексного регистров могут использоваться регистры общего назначения.
7 6 5 3 2 0
Рис. 15. Назначение разрядов байта SIB.
Отклонение является 8- или 16-разрядной величиной, используемой при вычислении исполнительного адреса операнда. Один или два байта отклонения располагаются в коде команды сразу за байтом ModRegR/M. Для 16-разрядного отклонения сначала идёт младший, затем – старший байты. Наличие отклонения определяется содержимым байта ModRegR/M:
16-разрядное отклонение присутствует в двух случаях: когда поле Mod байта ModRegR/M содержит значение 10, либо когда поле Mod содержит значение 00, а поле R/M – значение 110;
8-разрядное отклонение присутствует, когда поле Mod содержит значение 01.
Do'stlaringiz bilan baham: |