logo
Методичка

2.2 Типы адресации

32-разрядные процессоры в защищённом режиме могут использовать как 16-битную адресацию, так и 32-битную. Полный адрес хранится в регистровой паре сегмент-смещение (Segment-Offset). Смещение – количество байтов от начала сегмента до первого байта адресуемого числа. В таблице 2.2 указаны все случаи использования сегментных регистров.

Таблица 2.2 Использование сегментных регистров для адресации памяти.

Тип обращения к памяти

(The type of call to memory)

Сегментный регистр

(Segment register)

Смещение (Offset)

По умолчанию

(Default Segment)

Альтернативный

(Valid Overrides)

Выборка команд

CS

Нет

EIP

Стековые операции

SS

Нет

ESP

Адресация переменной

DS

CS, ES,FS, GS, SS

EA

Строка-источник

DS

CS, ES,FS, GS, SS

SI

Строка-приёмник

ES

Нет

DI

Использование EBP или ESP как базового регистра

SS

CS, DS, ES, FS,GS

EA

Таблица 2.3. Использование РОН для хранения смещения.

Компонент

16-разрядная адресация

32-разрядная адресация

Базовый регистр (Base)

BX или BP

Любой 32-разрядный РОН

Индексный регистр (Index)

SI или DI

Любой 32-разрядный РОН, кроме ESP

Масштаб (Scale)

Коэффициент 1

Коэффициенты 1, 2, 4 или 8

Элемент смещения

(Displacement)

Константа размером 0, 8 или 16 бит

Константа размером 0, 8 или 32 бита

Альтернативный регистр должен в программе указываться явно в виде регистровой пары. В таблице 2.3 представлено использование РОН для хранения смещения.

Типы адресации в 32-разрядных процессорах и способы вычисления смещения на основе компонент из таблицы 2 представлены в таблице 2.4.

Таблица 2.4. Типы адресации в 32-разрядных процессорах.

Тип адресации

Вычисление смещения

Непосредственная (immediate operand)

Операнд находится в коде команды

Регистровая (register operand)

Операнд находится в РОН

Прямая (memory operand)

Смещение операнда находится в коде команды

Косвенная регистровая

Смещение операнда находится в РОН

Базовая

Offset = Base + Displacement

Индексная

Offset = Index + Displacement

Масштабированная индексная

Offset = Scale Index + Displacement

Базовая индексная

Offset = Base + Index

Масштабированная базовая индексная

Offset = Base + Scale  Index

Базовая индексная со смещением

Offset = Base + Index + Displacement

Масштабированная базовая индексная со смещением

Offset = Base + Scale  Index + Displacement

С помощью базовой индексной адресации можно легко инициализировать и получить доступ к любому элементу одномерного массива. База задаёт начало массива, а индекс – смещение внутри массива. С помощью базово-индексной адресации со смещением можно легко инициализировать и получить доступ к элементам двумерного массива. База определяет начало массива, индекс – размер одной строки массива, а смещение – адрес элемента массива в строке.