За исключением специальных команд, таких как PUSH и POP, для которых режим
адресации определен заранее, режим адресации для текущей команды
описывается в байтах адресации. Этот байт следует за основным кодом
операции. Возможно использование двух байтов адресации: "mod r/m" (первый
байт) и "s-i-b" (второй байт, "масшта-индекс-база")
Байт "s-i-b" присутствует в команде, если используется режим 32- разрядной
адресации и байт "mod r/m" содержит поля r/m = 100 и mod = 00, 01 или 10.
Если байт "масштабирование-индекс-база" присутствует в команде,
32-разрядный режим адресации есть функция от полей mod, ss, index и base.
Первый байт адресации ( байт "mod r/m" ) содержит также три бита ( на
Рисунке 10.1 они обозначены TTT ), которые иногда используются как
расширение основного кода операции. В других случаях, эти три бита могут
использоваться в качестве поля reg.
При вычислении эффективного адреса используется 16-разрядный или
32-разрядный формат. Для вычисления 16-разрядного эффективного адреса
используются 16-разрядные компоненты, а для 32-разрядного - 32-разрядные
компоненты. При использовании 16-разрядной адресации байт "mod r/m"
интерпретируется как описатель 16-разрядного режима адресации, а при
использовании 32-разрядной адресации байт "mod r/m" интерпретируется как
описатель 32-разрядного режима адресации.
Следующие далее таблицы содержат определения всех возможных способов
кодирования для всех 16- и 32-разнядных режимов адресации.
Кодирование 16-разрядного режима адресации в байте "mod r/m"
+---------------------------------------------------+
| mod r/m | Эффективный адрес |
+------------------+--------------------------------|
| 00 000 | DS:[BX + SI] |
| 00 001 | DS:[BX + DI] |
| 00 010 | SS:[BP + SI] |
| 00 011 | SS:[BP + DI] |
| 00 100 | DS:[SI] |
| 00 101 | DS:[DI] |
| 00 110 | DS:d16 |
| 00 111 | DS:[BX] |
| | |
| 01 000 | DS:[BX + SI + d8] |
| 01 001 | DS:[BX + DI + d8] |
| 01 010 | SS:[BP + SI + d8] |
| 01 011 | SS:[BP + DI + d8] |
| 01 100 | DS:[SI + d8] |
| 01 101 | DS:[DI + d8] |
| 01 110 | SS:[BP + d8] |
| 01 111 | DS:[BX + d8] |
+---------------------------------------------------+
+---------------------------------------------------+
| mod r/m | Эффективный адрес |
+------------------+--------------------------------|
| 10 000 | DS:[BX + SI + d16] |
| 10 001 | DS:[BX + DI + d16] |
| 10 010 | SS:[BP + SI + d16] |
| 10 011 | SS:[BP + DI + d16] |
| 10 100 | DS:[SI + d16] |
| 10 101 | DS:[DI + d16] |
| 10 110 | SS:[BP + d16] |
| 10 111 | DS:[BX + d16] |
| | |
| 11 000 | регистр: см. ниже |
| 11 001 | регистр: см. ниже |
| 11 010 | регистр: см. ниже |
| 11 011 | регистр: см. ниже |
| 11 100 | регистр: см. ниже |
| 11 101 | регистр: см. ниже |
| 11 110 | регистр: см. ниже |
| 11 111 | регистр: см. ниже |
+---------------------------------------------------+
+---------------------------------------------------+
| Выбор регистра при помощи поля r/m |
| для 16-разрядных операций |
+---------------------------------------------------|
| | Функции поля w |
| mod r/m +-----------------------------------------|
| | ( когда w = 0 ) | ( когда w = 1 ) |
+---------+-------------------+---------------------|
| 11 000 | AL | AX |
| 11 001 | CL | CX |
| 11 010 | DL | DX |
| 11 011 | BL | BX |
| 11 100 | AH | SP |
| 11 101 | CH | BP |
| 11 110 | DH | SI |
| 11 111 | BH | DI |
+---------------------------------------------------+
+---------------------------------------------------+
| Выбор регистра при помощи поля r/m |
| для 32-разрядных операций |
+---------------------------------------------------|
| | Функции поля w |
| mod r/m +-----------------------------------------|
| | ( когда w = 0 ) | ( когда w = 1 ) |
+---------+-------------------+---------------------|
| 11 000 | AL | EAX |
| 11 001 | CL | ECX |
| 11 010 | DL | EDX |
| 11 011 | BL | EBX |
| 11 100 | AH | ESP |
| 11 101 | CH | EBP |
| 11 110 | DH | ESI |
| 11 111 | BH | EDI |
+---------------------------------------------------+
Кодирование 32-разрядного режима адресации в байте "mod r/m"
+---------------------------------------------------+
| mod r/m | Эффективный адрес |
+------------------+--------------------------------|
| 00 000 | DS:[EAX] |
| 00 001 | DS:[ECX] |
| 00 010 | SS:[EDX] |
| 00 011 | SS:[EBX] |
| 00 100 | присутствует s-i-b |
| 00 101 | DS:d32 |
| 00 110 | DS:[ESI] |
| 00 111 | DS:[EDI] |
| | |
| 01 000 | DS:[EAX + d8] |
| 01 001 | DS:[ECX + d8] |
| 01 010 | SS:[EDX + d8] |
| 01 011 | SS:[EBX + d8] |
| 01 100 | присутствует s-i-b |
| 01 101 | SS:[EBP + d8] |
| 01 110 | DS:[ESI + d8] |
| 01 111 | DS:[EDI + d8] |
+---------------------------------------------------+
+---------------------------------------------------+
| mod r/m | Эффективный адрес |
+------------------+--------------------------------|
| 10 000 | DS:[EAX + d32] |
| 10 001 | DS:[ECX + d32] |
| 10 010 | SS:[EDX + d32] |
| 10 011 | SS:[EBX + d32] |
| 10 100 | присутствует s-i-b |
| 10 101 | SS:[EBP + d32] |
| 10 110 | DS:[ESI + d32] |
| 10 111 | DS:[EDI + d32] |
| | |
| 11 000 | регистр: см. ниже |
| 11 001 | регистр: см. ниже |
| 11 010 | регистр: см. ниже |
| 11 011 | регистр: см. ниже |
| 11 100 | регистр: см. ниже |
| 11 101 | регистр: см. ниже |
| 11 110 | регистр: см. ниже |
| 11 111 | регистр: см. ниже |
+---------------------------------------------------+
+---------------------------------------------------+
| Выбор регистра при помощи поля r/m |
| для 16-разрядных операций |
+---------------------------------------------------|
| | Функции поля w |
| mod r/m +-----------------------------------------|
| | ( когда w = 0 ) | ( когда w = 1 ) |
+---------+-------------------+---------------------|
| 11 000 | AL | AX |
| 11 001 | CL | CX |
| 11 010 | DL | DX |
| 11 011 | BL | BX |
| 11 100 | AH | SP |
| 11 101 | CH | BP |
| 11 110 | DH | SI |
| 11 111 | BH | DI |
+---------------------------------------------------+
+---------------------------------------------------+
| Выбор регистра при помощи поля r/m |
| для 32-разрядных операций |
+---------------------------------------------------|
| | Функции поля w |
| mod r/m +-----------------------------------------|
| | ( когда w = 0 ) | ( когда w = 1 ) |
+---------+-------------------+---------------------|
| 11 000 | AL | EAX |
| 11 001 | CL | ECX |
| 11 010 | DL | EDX |
| 11 011 | BL | EBX |
| 11 100 | AH | ESP |
| 11 101 | CH | EBP |
| 11 110 | DH | ESI |
| 11 111 | BH | EDI |
+---------------------------------------------------+
Кодирование 32-разрядного режима адресации ( при наличии байта "mod r/m" и
байта "s-i-b" )
+---------------------------------------------------+
| mod r/m | Эффективный адрес |
+---------+-----------------------------------------|
| 00 000 | DS:[EAX + (масштабированный индекс)] |
| 00 001 | DS:[ECX + (масштабированный индекс)] |
| 00 010 | DS:[EDX + (масштабированный индекс)] |
| 00 011 | DS:[EBX + (масштабированный индекс)] |
| 00 100 | SS:[ESP + (масштабированный индекс)] |
| 00 101 | DS:[d32 + (масштабированный индекс)] |
| 00 110 | DS:[ESI + (масштабированный индекс)] |
| 00 111 | DS:[EDI + (масштабированный индекс)] |
| | |
| 01 000 | DS:[EAX+(масштабированный индекс)+d8] |
| 01 001 | DS:[ECX+(масштабированный индекс)+d8] |
| 01 010 | DS:[EDX+(масштабированный индекс)+d8] |
| 01 011 | DS:[EBX+(масштабированный индекс)+d8] |
| 01 100 | SS:[ESP+(масштабированный индекс)+d8] |
| 01 101 | SS:[EBP+(масштабированный индекс)+d8] |
| 01 110 | DS:[ESI+(масштабированный индекс)+d8] |
| 01 111 | DS:[EDI+(масштабированный индекс)+d8] |
| | |
| 10 000 | DS:[EAX+(масштабированный индекс)+d32] |
| 10 001 | DS:[ECX+(масштабированный индекс)+d32] |
| 10 010 | DS:[EDX+(масштабированный индекс)+d32] |
| 10 011 | DS:[EBX+(масштабированный индекс)+d32] |
| 10 100 | SS:[ESP+(масштабированный индекс)+d32] |
| 10 101 | SS:[EBP+(масштабированный индекс)+d32] |
| 10 110 | DS:[ESI+(масштабированный индекс)+d32] |
| 10 111 | DS:[EDI+(масштабированный индекс)+d32] |
+---------------------------------------------------+
Примечание: Поле mod расположено в байте "mod r/m", поля ss, index, base в
байте "s-i-b".
+---------------------------------------------------+
| ss | Коэффициент масштабирования |
+------------------+--------------------------------|
| 00 | *1 |
| 01 | *2 |
| 10 | *4 |
| 11 | *8 |
+---------------------------------------------------+
+---------------------------------------------------+
| index | Индексный регистр |
+------------------+--------------------------------|
| 000 | EAX |
| 001 | ECX |
| 010 | EDX |
| 011 | EBX |
| 100 | индексный регистр |
| | не используется ** |
| 101 | EBP |
| 110 | ESI |
| 111 | EDI |
+---------------------------------------------------+
** ВАЖНОЕ ЗАМЕЧАНИЕ: Когда поле index содержит 100, указывающее, что
мндексный регистр не используется, поле ss ДОЛЖНО содержать 00. В
противном случае эффективный адрес не определен.