КАТЕГОРИИ: Архитектура-(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; Просмотров: 421; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |