Пример 1: Фрагмент программы выборки элемента массива mas(2,3) и запись его значения в регистр al.
Data Mas db 23,4,5,67,5,6,1,99,67,8,9,23,87,9,0,8 i=2 j=3 ; 23 04 05 67 ; 05 06 01 99 ; 67 08 09 23 ; 87 09 00 08 Code ... 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) и его обнуления Data Mas dw 23,4,5,67,5,6,1,99,67,8,9,23,87,9,0,8 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 Code ... 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. В массиве определить количество элементов, которые больше среднего арифметического всех элементов массива. Элементы массива размером в слово. Для подсчёта среднего арифметического можно использовать сопроцессор.
Структуры Структура — это тип данных, состоящий из фиксированного числа элементов разного типа. Структура не является переменной, она только схема переменной. Для использования структур в программе необходимо выполнить следующее: 1. Задать шаблон структуры, то есть определить новый тип данных, который впоследствии можно использовать для определения переменных данного типа. 2. Определить экземпляр структуры (инициализация конкретной переменной с заранее определенной (с помощью шаблона) структурой). На этом этапе даётся указание транслятору выделить память и присвоить этой области памяти символическое имя. Описать структуру в программе можно только один раз, а определить — любое количество раз.
3. Организовать обращение к элементам структуры. Описание шаблона структуры Описание шаблона структуры имеет следующий синтаксис: Имя_структуры STRUC <описание полей> Имя_структуры ENDS
Здесь < описание полей > представляет собой последовательность директив описания данных db, dw, dd, dq и dt. Их операнды определяют размер полей и при необходимости начальные значения. Структуры не резервируют пространство в сегменте данных и не записывают ни одного байта в конечную программу. Местоположение шаблона в программе может быть произвольным, но, следует располагать шаблон структуры до того места, где определяется переменная с типом данной структуры. Смоделируем базу данных сотрудников некоторого отдела. Все поля базы данных символьные. Определим структуру записи этой базы данных следующим шаблоном:
Worker struc;информация о сотруднике nam db 30 dup (" ");фамилия, имя, отчество position db 30 dup (" ");должность age db 2 dup (" ");возраст standing db 2 dup (" ");стаж salary db 4 dup (" ");оклад в гривнах birthdate db 8 dup (" ");дата рождения Worker ends
Определение данных с типом структуры Для определения переменной с типом данной структуры используется используется следующая синтаксическая конструкция: [имя переменной] имя_структуры <[список значений]> Здесь: имя переменной — идентификатор переменной данного структурного типа. Задание имени переменной необязательно. Если его не указать, будет просто выделена область памяти размером в сумму длин всех элементов структуры. список значений — список начальных значений элементов структуры, разделенных запятыми. Его задание необязательно. Если список указан не полностью, то все поля структуры для данной переменной инициализируются значениями из шаблона, если таковые заданы. Допускается инициализация отдельных полей, но в этом случае пропущенные поля должны отделяться запятыми. Если при определении новой переменной с типом данной структуры нет необходимости менять значение полей в ее шаблоне, то нужно просто написать угловые скобки. К примеру:
victor worker <>. Определим несколько переменных с типом описанной выше структуры: .data segment sotr1 worker <’Гурко Андрей Вячеславовича’,’художник’,'33','15','1800','26.01.64'> sotr2 worker <’Михайлова Наталья Геннадьевна’,,'30','10','1680','27.10.58'> sotr3 worker<’Cтenaнов Юрий Лонгинович’,’художник’,’38’,'20','1750','01.01.58'> sotr4 worker<’Юрова Елена Александровна’,'связист',,'2',,'09.01.66'> sotr5 worker<>;здесь все значения по умолчанию
Методы работы со структурой Для того чтобы сослаться в команде на поле некоторой структуры, используется специальный оператор — символ «.» Он используется в следующей синтаксической конструкции:
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|