Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia_8-11_Massivy-struktury.doc
Скачиваний:
11
Добавлен:
21.12.2018
Размер:
1.47 Mб
Скачать

Xor ecx,ecx ;обнуление есx

xor edx,edx

mov cl,N ;значение счетчика цикла в cl

mov esi, 0 ;индекс начального элемента в si

;-------------------------------------------------------------------------------------------------

; Заполнение элементов массива значениями var E31111h++

mov eax,var

mov var2,eax

go2:

xor eax,eax

mov al,byte ptr [var+2] ; al=E3h

mov mas[esi],al

inc esi

mov al,byte ptr [var+1] ; al=11h

mov mas[esi],al

inc esi

mov al,byte ptr [var] ; al=11h

mov mas[esi],al

inc esi

inc var

loopnz go2

;--------------------------------------------------------------------------------------------

; Изменение первого байта в каждом элементе массива

mov esi,0 ;0 в si

xor ecx,ecx

mov cl,N

go:

mov dl,mas[esi] ;первый байт поля в dl

inc dl ;увеличение dl на 1 (по условию)

mov mas[esi],dl ;заслать обратно в массив

add esi,3 ;сдвиг на следующий элемент массива

loop go ;повтор цикла

mov cl,N

mov edi,0

mov esi,0

go1:

;----------------------------------------------------------------------------

; Переносим трёхбитное число из массива mas в регистр еах для перевода в

; десятичное число

xor eax,eax

xor ebx,ebx

mov ah,mas[esi]

mov al,mas[esi+1]

mov bl,mas[esi+2]

shl eax,8

add eax,ebx

add esi,3

;-------------------------------------------------------------------------------

; Перевод в десятичную систему исчисления трёхбайтного числа из eax и

; запись десятичного числа в память

push esi

mov ebx,eax

xor eax,eax

xor edx,edx

xor edi,edi

mov dl,i

mov al,8

mul dl

add eax,k

mov edi,eax

xor esi,esi

mov esi,10

push edi

mov eax,ebx

lp2: xor edx,edx

div esi

xchg eax,edx

add al,'0'

mov byte ptr [Msg+edi],al

xchg eax,edx

dec edi

or eax,eax

jne lp2

;-------------------------------------------------------------------------------------

; Ставим символ ";" в качестве разделителя после каждого числа

pop edi

mov byte ptr [Msg+edi+1],';'

inc i

inc k

pop esi

loopnz go1

;---------------------------------------------------------------------------------------

;вывод на экран получившегося массива

push 0h

push offset Ttl

push offset [Msg+1]

push 0h

call MessageBoxA

push 0h

call ExitProcess

end start

Результат:

_______________________________________________________________

Самостоятельно на практике: Создать массив с элементами нечетной длины. Размер элемента массива в три байта. Массив сформировать самостоятельно, следующим образом: первый элемент массива равен Е3 1111h=14 881 041d, все последующие трёхбайтные элементы массива равны inc(E3 1111h). В памяти сформировать массив из 16 трёхбайтных элемента. Увеличить на единицу в каждом элементе массива значение второго байта. Вывести измененный массив на экран построчно так, чтобы в строке было 4 элемента массива.

Двумерные массивы

Обращение к элементам двумерного массива в памяти как к строкам или как к столбцам зависит от алгоритма обработки двумерного массива.

Если последовательность однотипных элементов в памяти трактуется как двумерный массив, расположенный по строкам, то адрес элемента (i, j) вычисляется по формуле:

(база + количество_элементов_в_строке * размер_элемента * i+

+j* размер_элемента)

Здесь i = 0...n-l указывает номер строки, a j = 0...m-l указывает номер столбца.

Например, пусть имеется массив чисел (размером в 1 байт) mas(i,j) с размерностью 4 X 4 (i = 0...3, j = 0...3):

23 04 05 67

05 06 07 99

67 08 09 23

87 09 00 08

В памяти элементы этого массива будут расположены в следующей последовательности:

23 04 05 67 05 06 07 99 67 08 09 23 87 09 00 08

Если необходимо трактовать эту последовательность как двумерный массив и извлечь, например, элемент mas(2, 3) = 23, то, убедимся что:

Полный адрес mas(2, 3) = mas + 4 * 1 * 2 + 3*1 = mas + 11

Организовывают адресацию двумерного массива, используя базово-индексную адресацию. При этом возможны два основных варианта выбора компонентов для формирования полного адреса:

  1. сочетание прямого адреса, как базового компонента адреса, и двух индексных регистров для хранения индексов:

mov ax,mas[ebx][esi]

  1. сочетание двух индексных регистров, один из которых является и базовым, и индексным одновременно, а другой — только индексным:

mov ax,[edi][esi]

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]