Байт modR/M
опеспечивает большую гибкость при выборе форм адресации. Команды, в которых
после кода операции стоит байт modR/M, наиболее общие из всех команд. Для
операндов, расположенных в памяти и описаных при помощи байта modR/M
относительный адрес в выбранном сегменте складываеися из трех компонентов:
- Смещение
- Регистр базы
- Регистр индекса
(индексный регистр может умножаться на 2, 4 или 8)
Таблица 9 Правила выбора сегмента по умолчанию

Относительный
адрес, который получается в результате суммирования указаных компонентов называется
эффективным (исполнительным) адресом. Каждый из этих компонентов может иметь
как положительное, так и отрицательное значение. На Рисунке 2-10 показаны все
возможные варианты формирования исполнительного адреса при использовании байта
modR/M.
Т.к. смещение
закодированно непосредственно в команде, оно используется для адресации
фиксированных данных, таких как
- Простые
скалярные операнды
- Начало
статических массивов
- Смещение поля
внутри записи
База и индекс
выполняют сходные функции. Оба эти компонента использует одинаковый набор
регистров общего назначения. Оба могут использоваться для обращения по адресам,
которые изменяются в процессе выполнения программы, таким как:
- Параметры
процедуры, локальные переменные в стеке.
- Начало конкретной
записи в наборе записей одинаковой структуры или в массиве записей.
- Начало
одномерного массива в многомерном.
- Начало
динамически созданного массива.
При использовании
регистров общего назначения в качестве базы и индекса, следует помнить:
- Использование
регистра ESP в качестве индексного регистра недопустимо.
- Если в качестве
базы используются регистры ESP или EBP, по умолчанию выбирается сегмент SS. Во
всех остальных случаях по умолчанию выбирается сегмент DS.
Использования
коэффициента масштабирования позволяет эффективно организовывать индексацию в
массивах с 2-, 4- или 8-разрядными элементами. Масштабирование индексного
регистра выполняется аппаратно, одновременно с вычислением адреса. Это
исключает выполнение дополнительных операций сдвига или умножения.

Рис. 14. Вычисление эффективного
адреса
База, индекс и
смещение могут использоваться в различных комбинациях: некоторые из компонентов
могут быть пустыми. Коэффициент масштабирования может использоваться только
совместно с индексом. Каждая возможная комбинация полезна для общего
использования структур данных ассемблерными программами и программами языков
высокого уровня.
Смещение
Одно смещение
(без индекса и базы) указывает относительный адрес операнда. Такая форма
адресации используется для доступа к статическим скалярным операндам. Смещение
может иметь размер байта, слова или двойного слова.
База
Относительный
адрес операнда указывается косвенно, в одном из регистров общего назначения,
как для "смещенных" переменных.
База + Смещение
Регистр и
смещение могут быть использованы вместе с двух случаях:
1. Индекс в
статических массивах, элементы которых имеют размер, отличный от 2, 4 и 8 бит.
Смещение в этом случае кодирует относительный адрес начала массива. Регистр
содержит результаты вычислений, которые определяют смещение конкретного
элемента внутри массива.
2. Доступ к полю
записи. В этом случае регистр базы содержит адрес начала записи, а смещение
представляет собой относительный адрес нужного поля.
Важным частным случаем
использования такой комбинации (база + смещение) является доступ к параметрам в
записи активации процедуры. Запись активации процедуры - это кадр стека,
созданный при входе в процедуру. В данном случае, в качестве базового регистра
удобнее всего использовать EBP, т.к. при его использовании автоматически
выбирается сегмент стека. Такой способ доступа к параметрам процедуры
обеспечивает компактное кодирование команды.
( Индекс *
Коэффициент масштабирования ) + Смещение
Эта комбинация
обеспечивает наиболее эффективное индексирование в статических массивах,
элементы которых имеют размер 2, 4 или 8 бит. Смещение указывает адрес начала
массива, а индексный регистр содержит порядковый номер нужного элемента. При
этом процессор автоматически преобразует номер элемента в его смещение
относительно начала массива, используя коэффициент масштабирования.
База + Индекс +
Смещение
Совместное
использование двух регистров применяется для поддержки работы с двумерными
массивами (смещение содержит адрес начала массива) или для доступа к отдельным
экземплярам массива записей (смещение содержит относительный адрес поля внутри
записи).
База + ( Индекс *
Коэффициент масштабирования ) + Смещение
Такая комбинация
обеспечивает эффективное индексирование в двумерном массиве, если его элементы
имеют размер 2, 4 или 8 битов.