Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Типовые операции с массивами




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. В массиве определить количество элементов, которые больше среднего арифметического всех элементов массива. Элементы массива размером в слово. Для подсчёта среднего арифметического можно использовать сопроцессор.

 





Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 387; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.021 сек.