Моделирование одномерных массивов

Массив во внутреннем представлении - это последовательность элементов в памяти, например:

A dw 10,13,28,67,0,-1; массив из 6 чисел длиной слово.

Программирование обработки выполняется с использованием адресного регистра, в котором хранится либо адрес текущего элемента, либо его смещение относительно начала массива. При переходе к следующему элементу адрес (или смещение) увеличивается на длину элемента.

Пример.

Написать процедуру, выполняющую суммирование массива из 10 чисел размером слово.

Вариант 1 (используется адрес):   Вариант 2 (используется смещение):
summas proc   summas proc
mov ax, 0   mov ax, 0
lea bx, MAS   mov bx, 0
mov cx, 10   mov cx, 10
cycl: add ax, [bx]   cycl: add ax, MAS [bx]
add bx, 2   add bx, 2
loop cycl   loop cycl
ret   ret
summas endp   summas endp

 

 

Второй вариант позволяет получать более наглядный код и потому является предпочтительным.

В том случае, если элементы просматриваются непоследовательно, адрес элемента может рассчитываться по его номеру: 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



php"; ?>