Типовые операции с массивами
Code
Mas dw 23,4,5,67,5,6,1,99,67,8,9,23,87,9,0,8
Data
Code
Mas db 23,4,5,67,5,6,1,99,67,8,9,23,87,9,0,8
Data
23 04 05 67 05 06 07 99 67 08 09 23 87 09 00 08
87 09 00 08
67 08 09 23
05 06 07 99
23 04 05 67
В памяти элементы этого массива будут расположены в следующей последовательности:
Если необходимо трактовать эту последовательность как двумерный массив и извлечь, например, элемент mas(2, 3) = 23, то, убедимся что:
Полный адрес mas(2, 3) = mas + 4 * 1 * 2 + 3*1 = mas + 11
Организовывают адресацию двумерного массива, используя базово-индексную адресацию. При этом возможны два основных варианта выбора компонентов для формирования полного адреса:
4) сочетание прямого адреса, как базового компонента адреса, и двух индексных регистров для хранения индексов:
mov ax,mas[ebx][esi]
5) сочетание двух индексных регистров, один из которых является и базовым, и индексным одновременно, а другой — только индексным:
mov ax,[edi][esi]
Пример 1: Фрагмент программы выборки элемента массива mas(2,3) и запись его значения в регистр al.
i=2
j=3
; 23 04 05 67
; 05 06 01 99
; 67 08 09 23
; 87 09 00 08
...
mov si,4*1*i ; 1 – размер элемента массива 1 байт
mov di,j*1 ; 1 - размер элемента массива 1 байт
mov al,mas[si][di] ;в аl элемент mas(2,3)=23
Пример 2: Фрагмент программы выборки элемента массива mas(2,3) и его обнуления
i=2
j=3
; 00 23 00 04 00 05 00 67
; 00 05 00 06 00 01 00 99
; 00 67 00 08 00 09 00 23
; 00 87 00 09 00 00 00 08
...
mov si,4*2*i ; =16; 2 – размер элемента массива 2 байта
mov di,j*2 ; =6
mov ах,mas[si][di] ; в аx элемент mas(2,3)=mas+16+6=mas+22
; ax=0023
Пример 8. Поиск элемента в двумерном массиве. Элементы массива размером в слово. Размер массива 2х5. Искомый элемент 333. (find.asm)
.386
.model flat, stdcall
includelib import32.lib
extrn ExitProcess:PROC
extrn MessageBoxA:PROC
.data
Ttl db 'Find in massiv: ',0h
Msg db 150 dup (?)
;матрица размером 2х5 - если ее не инициализировать,
;то для наглядности она может быть описана так:
;array dw 2 DUP (5 DUP (?))
;но мы ее инициализируем:
array dw 333,333,333,45,55,333,333,2,333,333
;логически это будет выглядеть так:
;аггау= {333 333} 01 4D 01 4D
; {333 45} 01 4D 00 2D
; {55 333} 00 37 01 4D
; {333 2} 01 4D 00 02
; {333 333} 01 4D 01 4D
elem dw 333 ;элемент для поиска 01 4D
failed db 0ah,0dh,'Net takogo elementa v massive!',0h
success db 0ah,0dh,'Takou element prisytstvyet v massive '
foundtime db ? ;количество найденных элементов
fnd db " raz(a)",0ah,0dh,0h
.code
start:
xor ax,ax
mov esi,0 ;esi=столбцы в матрице
mov ebx,0 ;ebx=строки в матрице
mov ecx,5 ;число для внешнего цикла (по строкам)
external: ; внешний цикл по строкам
push ecx ; сохранение в стеке значение
; счетчика внешнего цикла
mov ecx,2 ;число для внутреннего цикла (по столбцам)
mov esi,0
iternal: ;внутренний цикл по столбцам
mov ax,array[ebx][esi] ;сравниваем содержимое текущего элемента в
; ax с искомым элементом:
inc esi ;передвижение на следующий элемент в строке
inc esi
cmp ax,elem ;если текущий совпал с искомым, то переход на
; here для обработки, иначе - цикл продолжения
; поиска
je here
;иначе - цикл по строке cx=2 раз
loop iternal
jmp move_next
here:
inc foundtime ;иначе - увеличиваем счетчик совпавших
sub ecx,1
cmp esi,4 ;просмотрели строку?
je move_next
jmp iternal
move_next: ;продвижение в матрице
pop ecx ;восстанавливаем CX из стека (5)
add ebx,4 ;передвигаемся на следующую строку
loop external ;цикл (внешний)
;______________________________________________________Конец поиска
cmp foundtime,0h ;сравнение числа совпавших с 0
ja eql ;если больше 0, то переход
not_equal: ;нет элементов, совпавших с искомым
push 0h
push offset Ttl
push offset failed
push 0h
call MessageBoxA
jmp exit ;на выход
eql: ;есть элементы, совпавшие с искомым
xor eax,eax
mov al,foundtime
add al,30h
mov foundtime,al
push 0h
push offset Ttl
push offset success
push 0h
call MessageBoxA
exit:
push 0h
call ExitProcess
end start
При анализе работы программы принято, что элементы массива нумеруются с 0. При поиске определенного элемента массив просматривается от начала и до конца. Программа сохраняет в поле foundtime количество вхождений искомого элемента в массив. В качестве индексных регистров используются si и bx.
_____________________________________________________________
Самостоятельно на практике: Разработать программу для работы с двумерным массивом размерностью 3х5. В массиве определить количество элементов, которые больше среднего арифметического всех элементов массива. Элементы массива размером в слово. Для подсчёта среднего арифметического можно использовать сопроцессор.