Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пример 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...