Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
23
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать

Лабораторная работа №5. Тема: Работа с массивами

І) Поиск заданного числа в массиве с элементами размером в один байт. Массив задан в программе и имеет размерность 5х2.

masm

model small

.stack 100h

.data

array db 2,5,6,2,5,6,7,2,9,4

; 2 5

; 6 2

; 5 6

; 7 2

; 9 4

elem db 8 ;элемент для поиска

failed db 0ah,0dh,'Net takogo elementa v massive!','$'

success db 0ah,0dh,'Takou element v massive prisutstvyet ','$'

foundtime db 0 ;количество найденных элементов

fnd db " raz(a)",0ah,0dh,'$'

.code

start:

mov ax,@data

mov ds,ax

xor ax,ax

mov si,0 ;si=столбцы в матрице

mov bx,0 ;bx=строки в матрице

mov cx,5 ;число для внешнего цикла (по строкам)

external: ;внешний цикл по строкам

push cx ;сохранение в стеке счетчика внешнего цикла

mov cx,2 ;число для внутреннего цикла (по столбцам)

mov si,0

iternal: ;внутренний цикл по строкам

mov al,array[bx][si]

inc si ;передвижение на следующий элемент в строке

cmp al,elem ;сравниваем содержимое текущего элемента в ax с искомым элементом

;если текущий не совпал с искомым, то переход на here для обработки,

;иначе – инкремент счетчика совпадений

jne here

inc foundtime ;иначе - увеличиваем счетчик совпавших

here:

loop iternal

jcxz move_next ;просмотрели строку?

move_next: ;продвижение в матрице

pop cx ;восстанавливаем CX из стека (5)

add bx,2 ;передвигаемся на следующую строку

loop external ;цикл (внешний)

cmp foundtime,0h ;сравнение числа совпавших с 0

ja eql ;если больше 0, то переход

not_equal: ;нет элементов, совпавших с искомым

mov ah,09h ;вывод сообщения на экран

mov dx, offset failed

int 21h

jmp exit ;на выход

eql: ;есть элементы, совпавшие с искомым

mov ah,09h ;вывод сообщений на экран

mov dx,offset success

int 21h

mov ah,02h

mov dl,foundtime

add dl,30h

int 21h

mov ah,09h

mov dx,offset fnd

int 21h

exit: ;выход

mov ax,4c00h ;стандартное завершение программы

ІІ) Поиск заданного числа в массиве с элементами размером в два байта. Массив задан в программе и имеет размерность 5х2.

masm

model small

.stack 100h

.data

array dw 10,2,65,2,5,64,70,1,98,42

; 10 2

; 65 2

; 5 64

; 70 1

; 98 42

elem dw 98 ;элемент для поиска

failed db 0ah,0dh,'Net takogo elementa v massive!','$'

success db 0ah,0dh,'Takou element v massive prisutstvyet ','$'

foundtime db 0 ;количество найденных элементов

fnd db " raz(a)",0ah,0dh,'$'

.code

start:

mov ax,@data

mov ds,ax

xor ax,ax

mov si,0 ;si=столбцы в матрице

mov bx,0 ;bx=строки в матрице

mov cx,5

mov si,0 ;число для внешнего цикла (по строкам)

external: ;внешний цикл по строкам

push cx ;сохранение в стеке счетчика внешнего цикла

mov cx,2 ;число для внутреннего цикла (по столбцам)

mov si,0

iternal: ;внутренний цикл по строкам

mov ax,array[bx][si]

inc si

inc si ;переходим в строке через 2 байта

cmp ax,elem ;сравниваем содержимое текущего элемента мас сива с искомым

;если текущий не совпал с искомым, то переход на here для обработки,

;иначе – инкремент счётчика совпадений

jne here

inc foundtime

here:

loop iternal

jcxz move_next ;просмотрели строку?

move_next: ;продвижение в матрице

pop cx ;восстанавливаем CX из стека (5)

add bx,4 ;передвигаемся на следующую строку

loop external ;цикл (внешний)

cmp foundtime,0h ;сравнение числа совпавших с 0

ja eql ;если больше 0, то переход

not_equal: ;нет элементов, совпавших с искомым

mov ah,09h ;вывод сообщения на экран

mov dx, offset failed

int 21h

jmp exit ;на выход

eql: ;есть элементы, совпавшие с искомым

mov ah,09h ;вывод сообщений на экран

mov dx,offset success

int 21h

mov ah,02h

mov dl,foundtime

add dl,30h

int 21h

mov ah,09h

mov dx,offset fnd

int 21h

exit: ;выход

mov ax,4c00h ;стандартное завершение программы

int 21h

end start

IІІ) Поиск заданного числа в массиве с элементами размером в один байт. При этом массив задаётся пользователем и элемент для поиска тоже задаётся пользователем. На экран при вводе массива выдаётся номер строки и номер столбца вводимого элемента. Масив размерностью в 5х3.

masm

model small

.stack 100h

.data

array db 15 dup (?)

; 8 8 5

; 6 2 3

; 5 6 7

; 7 2 1

; 0 8 8

A1 db ? ;элемент для поиска

failed db 0ah,0dh,'Net takogo elementa v massive!','$'

success db 0ah,0dh,'Takou element v massive prisutstvyet ','$'

foundtime db 0 ;количество найденных элементов

fnd db " raz(a)",0ah,0dh,'$'

mes2 db 13,10,'Vvedite element massiva [','$'

mes3 db 'Vvedite element dlya poiska',13,10,'$'

mes4 db ']',13,10,'$'

mm1 db ?

mm2 db ?

mm3 db ?

.code

start:

mov ax,@data

mov ds,ax

mov dx,offset mes3

mov ah,09h ;функция Dos вывода сообщения на

int 21h

xor ax,ax

mov ah,1h

int 21h

sub al,'0'

mov a1,al

xor ax,ax

mov si,0 ;si=столбцы в матрице

mov bx,0 ;bx=строки в матрице

mov cx,5 ;число для внешнего цикла (по строкам)

external: ;внешний цикл по строкам

push cx ;сохранение в стеке счетчика внешнего цикла

mov cx,3 ;число для внутреннего цикла (по столбцам)

mov si,0

iternal:

mov dx,offset mes2

mov ah,09h ;функция Dos вывода сообщения на

int 21h

xor ax,ax

mov ax,bx ;выводим на экран номер строки в массиве. Номер

;строки хранится в bx

mov dh,3

div dh

add al,'0'

mov byte ptr [mm1],al

mov byte ptr [mm1+1],'$'

mov dx,offset mm1

mov ah,09h ;функция Dos вывода сообщения на

int 21h

mov dl,':' ;ставим двоеточие после номера строки

mov byte ptr [mm2],dl

mov byte ptr [mm2+1],'$'

mov dx,offset mm2

mov ah,09h ;функция Dos вывода сообщения на

int 21h

mov dx,si ;после запятой выводим номер столбца, элемент

;которого вводим. Номер столбца хранится в si

add dx,'0'

mov byte ptr [mm3],dl

mov byte ptr [mm3+1],'$'

mov dx,offset mm3

mov ah,09h

int 21h

mov dx,offset mes4

mov ah,09h

int 21h

xor ax,ax

mov ah,1h

int 21h

sub al,'0'

xor dx,dx

mov dh,a1

mov array[bx][si],al

;сравниваем содержимое текущего элемента в массиве

;с искомым элементом в dh:

cmp array[bx][si],dh

jne here ; если значение в массиве и значение в dh совпали, то

inc foundtime ;увеличиваем счетчик совпадений

here:

inc si ;иначе - цикл по строке

loop iternal

jcxz move_next ;просмотрели строку?

move_next: ;продвижение в матрице

pop cx ;восстанавливаем CX из стека (5)

add bx,3 ;передвигаемся на следующую строку

loop external ;цикл (внешний)

cmp foundtime,0h ;сравнение числа совпавших с 0

ja eql ;если больше 0, то переход на метку eql, иначе, если

not_equal: ;нет элементов, совпавших с искомым

mov ah,09h ;вывод сообщения на экран

mov dx, offset failed

int 21h

jmp exit ;на выход

eql: ;есть элементы, совпавшие с искомым

mov ah,09h ;вывод сообщений на экран

mov dx,offset success

int 21h

mov ah,02h

mov dl,foundtime

add dl,30h

int 21h

mov ah,09h

mov dx,offset fnd

int 21h

exit: ;выход

mov ax,4c00h ;стандартное завершение программы

int 21h

end start

Задание для самостоятельной работы:

IV) Написать программу для поиска заданного числа в массиве с элементами размером в два байта. При этом массив должен задаваться пользователем и элемент для поиска тоже должен задаваться пользователем. Элементы массива и элемент для поиска задаётся в шестнадцатиричной системе исчисления. На экран при вводе массива необходимо выдать номер строки и номер столбца вводимого элемента. Масcив размерностью в 5х2. Программа также должна выдать массив на экран в табличном виде.