Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
V_ostavsheysya_chasti_etoy_glavy_opisyvaetsya_organizatsia_pamyati_i_adresnogo_prostranstva.docx
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
44 Кб
Скачать
☆

3.7.5. Определение смещения

Смещение части адреса памяти может быть задано непосредственно как статическое значение (называемое смещением) или путем вычисления адреса, состоящего из одного или нескольких из следующих компонентов:

• Смещение - 8-, 16- или 32-битное значение.

• Base - значение в регистре общего назначения.

• Индекс - значение в регистре общего назначения.

• Масштабный коэффициент - значение 2, 4 или 8, умноженное на значение индекса.

Смещение, возникающее в результате добавления этих компонентов, называется эффективным адресом. Каждый из этих компонентов может иметь либо положительное, либо отрицательное (2s дополнение) значение, за исключением коэффициента масштабирования. На рисунке 3-11 показаны все возможные способы объединения этих компонентов для создания эффективного адреса в выбранном сегменте.

Рисунок 3-11. Вычисление смещения (или эффективного адреса)

Использование регистров общего назначения в качестве базовых или индексных компонентов ограничено следующим образом:

• Регистр ESP не может использоваться как индексный регистр.

• Когда в качестве базы используется регистр ESP или EBP, сегмент SS является сегментом по умолчанию. Во всех остальных случаях сегмент DS является сегментом по умолчанию.

Компоненты базы, индекса и смещения могут использоваться в любой комбинации, и любой из этих компонентов может быть NULL. Масштабный коэффициент может использоваться только при использовании индекса. Каждая возможная комбинация полезна для структур данных, обычно используемых программистами на языках высокого уровня и ассемблере.

Следующие режимы адресации предполагают использование общих комбинаций адресных компонентов.

• Смещение ⎯ Одно только смещение представляет собой прямое (несоизмеримое) смещение к операнду. Поскольку перемещение кодируется в инструкции, эта форма адреса иногда называется абсолютным или статическим адресом. Он обычно используется для доступа к статически распределенному скалярному операнду.

• База ⎯ Только база представляет собой косвенное смещение операнда. Поскольку значение в базовом регистре может измениться, оно может использоваться для динамического хранения переменных и структур данных.

• База + смещение ⎯ Базовый регистр и смещение могут использоваться вместе для двух различных целей:

- Как индекс в массив, когда размер элемента не равен 2, 4 или 8 байтам. Компонент смещения кодирует статическое смещение в начале массива. Базовый регистр содержит результаты вычисления для определения смещения для определенного элемента в массиве.

- Для доступа к полю записи: базовый регистр содержит адрес начала записи, а смещение - статическое смещение в поле.

Важным частным случаем этой комбинации является доступ к параметрам в записи активации процедуры. Запись активации процедуры представляет собой фрейм стека, созданный при вводе процедуры. Здесь регистр EBP является лучшим выбором для базового регистра, поскольку он автоматически выбирает сегмент стека. Это компактная кодировка для этой общей функции.

• (Индекс * Масштаб) + Смещение ⎯ Этот режим адресов предлагает эффективный способ индексирования в статический массив, когда размер элемента равен 2, 4 или 8 байтам. Перемещение определяет начало массива, индексный регистр содержит индекс требуемого элемента массива, и процессор автоматически преобразует индекс в индекс, применяя масштабный коэффициент.

• Base + Index + Displacement ⎯ Использование двух регистров вместе поддерживает либо двумерный массив (смещение содержит адрес начала массива), либо один из нескольких экземпляров массива записей (смещение является смещением к полю в пределах записи).

• Base + (Index * Scale) + Displacement ⎯ Использование всех компонентов адресации вместе позволяет эффективно индексировать двумерный массив, когда элементы массива имеют размер 2, 4 или 8 байтов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]