Двухмерные массивы
С представлением
массивов в программе на ассемблере и организа-
цией их обработки все достаточно просто. А как быть, если программа должна об-
рабатывать двухмерный массив? Все проблемы возникают по-прежнему из-за того,
что специальных средств для описания такого типа данных в ассемблере нет. Двух-
мерный массив нужно моделировать. На описании самих данных это почти никак
не отражается — память под массив выделяется с помощью директив резервиро-
вания и инициализации памяти. Непосредственно моделирование обработки мас-
сива производится в сегменте кода, где программист, описывая алгоритм обработки
на ассемблере, определяет, что некоторую область памяти необходимо трактовать
как двухмерный массив. При этом вы вольны в выборе
как понимать распо-
элементов двухмерного массива в памяти: по строкам или по столбцам.
Если последовательность однотипных элементов в памяти трактуется как двух-
мерный массив, расположенный по
то адрес элемента (i, вычисляется
по формуле
(база +
• i + j) • размер_элемента).
276 Глава
Сложные структуры данных
Здесь i =
— номер строки, aj
— номер столбца. Например, пусть
имеется массив чисел (размером в 1 байт)
j) с размерностью 4 • 4 (г 0...3,
23040567
05060799
67080923
87090008
В памяти элементы этого массива будут расположены в следующей последова-
тельности:
23 04 05 67 05 06 07 99 67 08 09 23 87 09 00 08
Если мы хотим трактовать эту последовательность как двухмерный массив,
приведенный раньше, и извлечь, например, элемент
3) = 23, то, проведя не-
хитрый подсчет, убедимся в правильности наших рассуждений:
Эффективный адрес
3) mas + (4 • 2 + 3) • 1= mas + 22.
Посмотрите на представление массива в памяти и убедитесь,
по этому сме-
щению действительно находится нужный элемент массива.
Логично организовать адресацию двухмерного массива, используя рассмотрен-
ную нами ранее базово-индексную адресацию. При этом возможны два основных
варианта выбора компонентов для формирования эффективного адреса:
* сочетание прямого адреса как базового компонента адреса и двух индексных
регистров для хранения индексов:
mov
сочетание двух индексных регистров, один из которых является и базовым, и ин-
дексным одновременно, а другой — только индексным:
mov
В программе это будет выглядеть примерно так:
программы выборки элемента
и его обнуления
mas db
i=2
]=3
el_size=l
mov
mov
*el_size
mov
al элемент m a s ( 2 , 3 )
В качестве законченного примера рассмотрим программу поиска элемента в двух-
мерном массиве чисел (листинг 13.4). Элементы массива заданы статически.
Листинг
Поиск элемента в двухмерном массиве
MODEL
STACK 256
Массивы 277
размером 2x5 - если ее не
для наглядности она может быть описана так:
;аггау
2
(5 DUP (?))
мы ее инициализируем:
array dw
это будет выглядеть так:
2}
3}
6}
3}
0}
элемента
3
для поиска
failed db
такого элемента в
success db
элемент в массиве присутствует
db
fnd db '
main:
xor
mov s 0
mov
bx,0
mov
push
mov
mov s 0
наиденных элементов
в матрице
;Ьх=строки в матрице
;число для внешнего цикла (по строкам)
;внешний цикл по строкам
в стеке счетчика внешнего цикла
для внутреннего цикла (по столбцам)
цикл по строкам
mov
ах первый (очередной) элемент матрицы
add
на следующий элемент в строке
содержимое текущего элемента в ах с искомым элементом:
;если текущий совпал с искомым, то переход на here для обработки,
- цикл продолжения поиска
foundtime
счетчик совпавших
loop iternal
pop
add
loop external
cmp
mov
mov
failed
21h
в матрице
СХ из стека (5)
на следующую строку
;цикл (внешний)
числа совпавших с 0
больше 0, то переход
совпавших с искомым
сообщения на экран
eql:
exit:
end
mov
;
mov
success
int
mov
mov
add
int 21h
mov
mov
fnd
mov
int
main
на выход
есть элементы, совпавшие с искомым
вывод сообщений на экран
выход
стандартное завершение программы
конец программы
278 Глава
Сложные структуры данных
Анализируя работу программы, не забывайте, что при написании программ на
языке ассемблера нумерацию элементов массива удобнее производить с 0. При
поиске определенного элемента массив просматривается от начала и до конца.
Программа сохраняет в поле
количество вхождений искомого элемента
в массив. В качестве индексных используются регистры SI и ВХ.
Do'stlaringiz bilan baham: |