Вычисление эффективного (исполнительного) адреса

Байт 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 битов.

 

 

 

HotLog

Заказчику web дизайна и программирования - каталог сайтов, обзор дизайн студий