В мир информатики # 98 (16–30 ноября).
Эксперименты
Как процессор обменивается данными с
памятью
Продолжение. Начало см. “В мир
информатики” № 96–97 / “Информатика” № 20–21/2007
Е.А. Еремин,
г. Пермь
3.3. Адресация двумерных массивов
данных
Перейдем теперь к рассмотрению
размещения в памяти двумерных массивов и
способов доступа к их отдельным элементам.
Типичная картина расположения в памяти
элементов массива 3 х 3 приведена на рис. 2;
отдельные строки на рисунке для наглядности
сдвинуты.

Как утверждается в [1], “за исключением
языка FORTRAN, все языки хранят двумерные массивы
как последовательность строк… Такое размещение
вполне естественно, поскольку сохраняет
идентичность двумерного массива и массива
массивов”.
Для доступа к элементу массива со
значениями индексов i и j необходимо, по
сравнению со случаем одномерного массива,
добавить еще слагаемое, учитывающее полный
размер всех предшествующих строк (строки опять
же удобнее нумеровать с нуля!). В итоге расчетная
формула для нашего экспериментального массива с i
= 0, 1, 2 и j = 0, 1, 2 приобретет вид:
Ai,j = A0 + Di,j =
A0 + 6i + 2j
(число 6 получено как произведение
числа элементов в строке на размер каждого
элемента).
Для индексирования нам теперь уже
потребуется два регистра, скажем, BX и SI (один
базовый, другой индексный). Применив
базово-индексный метод адресации со смещением,
получим программу, реализация которой дается в
протоколе 4. Как не без иронии заметил в своей
книге [1] М.Бен-Ари, “Вы, возможно, удивитесь,
узнав, что для каждого доступа к массиву нужно
столько команд!”.

Особенно длинно выглядит умножение
строкового индекса i на 6: мало того, что
нельзя умножить на константу и ее приходится
отдельной командой помещать в регистр AL4,
но еще дополнительно требуется возвращать
произведение из AX обратно в BX.
Примечание. Важно
подчеркнуть, что описанный в эксперименте способ
вычисления адреса используется только в том
случае, когда значения i и j заранее
неизвестны и в ходе исполнения берутся из
переменных. Если же в тексте программы написан
элемент с конкретными индексами, например, M1,1,
то современный компилятор немедленно определяет
адрес этого элемента в памяти и генерирует всего
одну команду с прямой адресацией, в нашем примере
MOV AX,[208].
Поскольку порядок проведения
эксперимента с двумерным массивом существенно
ничем не отличается от описанного в предыдущем
разделе, все комментарии опустим.
Задания для самостоятельной работы
1. Изменив значения констант в первых
двух командах, убедитесь в правильности
получения элемента массива с заданными вами
индексами. Отдельно проанализируйте случаи с
неправильно заданными индексами, например, для M1,4
и M4,1; подумайте, какой из них
“опаснее”.
2. Используя приведенную ниже таблицу с
кодами программы, которая реализует 32-разрядный
метод адресации с масштабированием (в ней
16-разрядные команды, выделенные жирным шрифтом,
можно набирать на ассемблере), введите и
исполните ее в Debug.

Ход реализации эксперимента
аналогичен представленному в протоколе 3 (см.
предыдущий выпуск).
3. Напишите и реализуйте в Debug программу
суммирования элементов массива. Сможете ли вы ее
написать так, чтобы она оказалась пригодной и для
одномерного массива?
Литература
1. Бен-Ари М. Языки программирования.
Практический сравнительный анализ. М.: Мир, 2000.
4 В программе для простоты перемножаются
два 8-битных числа. |