Массив во внутреннем представлении - это последовательность элементов в памяти, например:
A dw 10,13,28,67,0,-1; массив из 6 чисел длиной слово.
Программирование обработки выполняется с использованием адресного регистра, в котором хранится либо адрес текущего элемента, либо его смещение относительно начала массива. При переходе к следующему элементу адрес (или смещение) увеличивается на длину элемента.
Пример.
Написать процедуру, выполняющую суммирование массива из 10 чисел размером слово.
|
Второй вариант позволяет получать более наглядный код и потому является предпочтительным.
В том случае, если элементы просматриваются непоследовательно, адрес элемента может рассчитываться по его номеру: Aисп=Aначала+(<номер>-1)*<длина элемента>. Полученный по формуле адрес записывается в один из адресных регистров (BX, BP, DI, SI) и используется для доступа к элементу.
Пример.
Написать процедуру, которая извлекает из массива, включающего 10 чисел размером слово, число с номер n (n£10).
N_mas proc
mov bx, N; номер числа
dec bx; вычитаем 1
sal bx, 1; умножили на длину (сдвинули влево на 1)
mov ax, MAS [bx]; результат в ax
Ret
N_mas endp
Моделирование матриц
Значения матрицы могут располагаться в памяти по строкам и по столбцам. Для определенности будем считать, что матрица расположена в памяти построчно.
При моделировании обработки матрицы следует различать просмотр по строкам, просмотр по столбцам, просмотр по диагоналям и произвольный доступ.
Просмотр по строкам иногда может выполняться так, как в одномерном массиве (без учета перехода от одной строки к другой).
Пример.
Написать процедуру определения максимального элемента матрицы A(3,5).
Mахмatr proc
mov bx, 0; смещение 0
mov cx, 14; счетчик цикла
mov ax, A; заносим первое число
cycl: cmp ax, A[bx+2]; сравниваем числа
jge next; если больше, то перейти к следующему
mov ax, A[bx+2]; если меньше, то запомнить
next: add bx, 2; переходим к следующему числу
Loop cycl
ret; результат в ax
Mахмatr endp
Просмотр по строкам при необходимости фиксировать завершение строки и просмотр по стобцам выполняются в двойном цикле: по строкам - во внешнем цикле, по столбцам - во внутреннем или наоборот. В этом случае обычно отдельно формируются смещения строки и столбца.
Пример.
Определить сумму максимальных элементов столбцов матрицы A(3,5).
Mахмatr proc
mov ax, 0; обнуляем сумму
mov bx, 0; смещение элемента столбца в строке
mov cx, 5; количество столбцов
cycl1: push cx; сохраняем счетчик
mov cx, 2; счетчик элементов в столбце
mov dx, A[bx]; заносим первый элемент столбца
mov si, 10; смещение второго элемента столбца
cycl2: cmp dx, A[bx]+ [si]; сравниваем
jge next; если больше или равно - к следующему
mov dx, A[bx]+[si]; если меньше, то сохранили
next: add si, 10; переходим к следующему элементу
loop cycl2; цикл по элементам столбца
add ax, dx; просуммировали макс. элемент
pop cx; восстановили счетчик
add bx, 2; перешли к следующему столбцу
loop cycl1; цикл по столбцам
ret; результат в ax
Mахмatr endp