С представлением одномерных массивов в программе на ассемблере и организацией их обработки все достаточно просто. А как быть если программа должна обрабатывать двухмерный массив? Все проблемы возникают по-прежнему из-за того, что специальных средств для описания такого типа данных в ассемблере нет. Двухмерный массив нужно моделировать. На описании самих данных это почти никак не отражается — память под массив выделяется с помощью директив резервирования и инициализации памяти.
Непосредственно моделирование обработки массива производится в сегменте кода, где программист, описывая алгоритм обработки ассемблеру, определяет, что некоторую область памяти необходимо трактовать как двухмерный массив. При этом вы вольны в выборе того, как понимать расположение элементов двухмерного массива в памяти: по строкам или по столбцам.
Если последовательность однотипных элементов в памяти трактуется как двухмерный массив, расположенный по строкам, то адрес элемента (i, j) вычисляется по формуле
|
|
(база + количество_элементов_в_строке * размер_элемента * i+j)
Здесь i = 0...n–1 указывает номер строки, а j = 0...m–1 указывает номер столбца.
Например, пусть имеется массив чисел (размером в 1 байт) mas(i, j) с размерностью 4 на 4 (i= 0...3, j = 0...3):
23 04 05 67 05 06 07 99 67 08 09 23 87 09 00 08В памяти элементы этого массива будут расположены в следующей последовательности:
23 04 05 67 05 06 07 99 67 08 09 23 87 09 00 08
Если мы хотим трактовать эту последовательность как двухмерный массив, приведенный выше, и извлечь, например, элемент mas(2, 3) = 23, то проведя нехитрый подсчет, убедимся в правильности наших рассуждений:
Эффективный адрес mas(2, 3) = mas + 4 * 1 * 2 + 3 = mas + 11
Посмотрите на представление массива в памяти и убедитесь, что по этому смещению действительно находится нужный элемент массива.
Организовать адресацию двухмерного массива логично, используя рассмотренную нами ранее базово-индексную адресацию. При этом возможны два основных варианта выбора компонентов для формирования эффективного адреса:
· сочетание прямого адреса, как базового компонента адреса, и двух индексных регистров для хранения индексов:
mov ax,mas[ebx][esi]· сочетание двух индексных регистров, один из которых является и базовым и индексным одновременно, а другой — только индексным:
mov ax,[ebx][esi]В программе это будет выглядеть примерно так:
;Фрагмент программы выборки элемента массива mas(2,3) и его обнуления.datamas db23,4,5,67,5,6,7,99,67,8,9,23,87,9,0,8i=2j=3.code... mov si,4*1*i mov di,j mov al,mas[si][di];в al элемент mas(2,3)...В качестве законченного примера рассмотрим программу поиска элемента в двухмерном массиве чисел. Элементы массива заданы статически.
|
|
При анализе работы программы не забывайте, что в языке ассемблера принято элементы массива нумеровать с 0. При поиске определенного элемента массив просматривается от начала и до конца. Приведенная программа сохраняет в поле foundtime количество вхождений искомого элемента в массив. В качестве индексных регистров используются si и bx.