Реклама:

Часто нужно уметь обращаться к словам памяти по известному смещению. Подобные примеры мы видели в машине IJVM, где локальные переменные определяются по смещению от регистра LV. Обращение к памяти по регистру и константе смещения называется индексной адресацией.

В машине IJVM при доступе к локальной переменной используется указатель ячейки памяти (LV) в регистре плюс небольшое смещение в самой команде, как показано на рис. 4.14, а. Есть и другой способ: указатель ячейки памяти в команде и небольшое смещение в регистре. Чтобы показать, как работает этот механизм, рассмотрим следующий пример. Пусть у нас есть два одномерных массива А и В по 1024 слова в каждом. Нам нужно вычислить Д И В{ для всех пар, а затем соединить все эти 1024 логических произведения операцией ИЛИ, чтобы узнать, есть ли в этом наборе хотя бы одна пара, не равная нулю. Один из вариантов - поместить адрес массива А в один регистр, а адрес массива В - в другой регистр, а затем последовательно перебирать элементы массивов аналогично тому, как мы делали в предыдущей программе (см. листинг 5.1). Такая программа, конечно же, будет работать, но ее можно усовершенствовать, как показано в листинге 5.2.

Листинг 5.2. Программа на ассемблере, выполняющая операцию ИЛИ для 1024 элементов массива

MOV R1,#0 ; собирает результаты выполнения ИЛИ в R1,

; изначально О MOV R2,#0 ; R2 = индекс, i от текущего

; произведения A[i] И B[i] MOV R3,#4096 ; R3 = первое ненужное значение индекса

LOOP: MOV R4,A(R2) : R4 = A[i]

AND R4,B(R2) : R4 = A[i] И B[i] OR R1.R4

ADD R2,#4 ; i = i + 4

CMP R2.R3 ; нужно ли продолжать?

BLT LOOP ; если R2 < R3, нужно продолжать

Здесь нам требуется 4 регистра:

+ R1 - содержит результаты суммирования логических произведений;

+ R2 - индекс г, который используется для перебора элементов массива;

+ R3 - константа 4096 (это самое маленькое значение г, которое не используется);

+ R4 - временный регистр для хранения каждого произведения.

После инициализации регистров мы входим в цикл из шести команд. Команда с меткой LOOP вызывает элемент Д в регистр R4. При вычислении источника здесь используется индексная адресация. Регистр (R2) и константа (адрес элемента А) складываются, полученный результат служит для обращения к памяти. Сумма этих двух величин поступает в память, но не сохраняется ни в одном из доступных пользователю регистров. Следующая запись означает, что для определения приемника используется регистровая адресация, а для определения источника - индексная:

MOV R4.ACR2)

Здесь R4 - это регистр, А - смещение, R2 - регистр. Если А имеет значение, скажем, 124 300, то соответствующая машинная команда будет выглядеть так, как показано на рис. 5.14.

Индексная адресация

Рис. 5.14. Возможное представление команды MOV R4, A(R2) в памяти

Во время первого прохождения цикла регистр R2 принимает значение 0 (так регистр инициализируется), поэтому нужное нам слово А0 находится в ячейке с адресом 124 300. Это слово загружается в регистр R4. При следующем прохождении цикла R2 принимает значение 4, поэтому нужное нам слово Д находится в ячейке с адресом 124 304 и т. д.

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

Косвенная регистровая адресация || Оглавление || Относительная индексная адресация