© Данная статья была опубликована в № 22/2007 журнала "Информатика" издательского дома "Первое сентября". Все права принадлежат автору и издателю и охраняются.      Главная страница "Первого сентября"
     Главная страница журнала "Информатика"
     Содержание № 22/2007
 В мир информатики # 98 (16-30 ноября). Как процессор обменивается данными с памятью


В мир информатики # 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-битных числа.