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