Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


mov cx, 10;Размер масива(Счетчик)



Mov bx, offset x; адрес начала массива x

Call VvodMass

; Начало ввода массива y

Lea dx, t6

Call p1

Mov cx, 12; Размер масива(Счетчик)

Mov bx, offset y; адрес начала массива y

Call VvodMass

; Начало вывода массива x

Lea dx, t5

Call p1

Mov cx, 10; Размер масива(Счетчик)

Mov bx, offset X; адрес начала массива x

Call VivodMass

; Фильтр x

Lea dx, t7

Call p1

Mov cx, 10; Размер масива(Счетчик)

Mov bx, offset X; адрес начала массива x

Mov k, 0

Call filtr

Mov ax, k

call print_num

; Начало вывода массива y

Lea dx, t6

Call p1

Mov cx, 12; Размер масива(Счетчик)

Mov bx, offset y; адрес начала массива y

Call VivodMass

; Фильтр y

Lea dx, t7

Call p1

Mov cx, 12; Размер масива(Счетчик)

Mov bx, offset y; адрес начала массива y

Mov k, 0

Call filtr

Mov ax, k

call print_num

; Программа все забывает

Mov ah, 4ch

Int 21h

P1 proc near

Mov ah, 9

Int 21h

Ret

P1 endp

VvodMass proc near

; bx - смешение массива

; cx - количество элементов в массива

cikl:

Push cx; cx в стек

Lea dx, t1; Сообщение: Введите элемент массива

Call p1; Вызов процедуры p1

call scan_num; Ждем ввода числа(Запись идет в cx)

mov [bx], cx; [bx] - обращение к памяти с адресом ds: [bx]

Add bx, 2; Прибовляем 2 к bx(Переход к следующему элементу)

Pop cx; Выталкиваем из стека

Loop cikl

lea dx, t2; 'Массив введен $'

Call p1

Ret

VvodMass endp

VivodMass proc near

; Процедура вывода массива

; bx- смещение массива

; cx - количество элементов массива

cikl1:

mov ax, [bx];!!!!

call print_num;!!!!!

Lea dx, probel

Call p1

Add bx, 2

Loop cikl1

Ret

VivodMass endp

Filtr proc near

Push cx; cx в стек (Сначало 8)

mov r, 1; проверочное число от 1 до [bx]/2

mov ax, [bx]; записываем в ах [bx]

Cmp ax, 0

Jle m4; проверка числа отрицательное/ положительное

Cmp ax, 1

je m3; если элемент массива =1 то увеличиваем K

Cmp ax, 2

je m3; если элемент массива =2 то увеличиваем K

Cmp ax, 3

je m3; если элемент массива =3 то увеличиваем K

Mov dx, 0; обнуляем dx

Mov cx, 2

Cwd

Idiv cx; делим элемент массива на 2

Cmp dx, 0

Je m4; если после деления нет отстатка, то число четное, переходим к следующему элементу

M1: ; метка проверки простое/составное число

Inc r; увеличение на 1 проверочное число

mov ax, [bx]; записываем в ах [bx]

Cwd

Idiv r; делим на проверочное число

Imul r; умножаем на проверочное число

cmp ax, [bx]; сравниваем

Je m4; если равны, то число не простое и переходим к следующему

mov ax, [bx]; записываем в ах [bx]

Mov cx, 2

Cwd

idiv cx; делим [bx] на 2

Cmp ax, r; сравниваем

Je m3; если равны, то переход на метку m3

Jmp m1; иначе продолжаем проверку

M3: ; метка используемая, если число простое

Inc k; увеличиваем количество простых чисел

M4: ; метка используемая, для перехода к следующему числу

Pop cx; вытаскиваем проверочное число из стека

Add bx, 2; переходим к следующему эллементу массива

Loop filtr; переходим к началу цикла

Ret

Filtr endp

a_code ends

define_scan_num

define_print_num

define_print_num_uns

End begin

 

Протокол работы программы

X[10] Y[12] кол-во простых чисел в массиве Х кол-во простых чисел в массиве Y Назначение теста
1, 7, -11, 18, 103, -20, -7, 50, 29, 28 2, 3, 4, 5, 17, -51, 81, 10, 37, 83, 15, 9 Тестовый запуск

Для того, чтобы убедиться в правильности написанного кода и работе программы проведем несколько прогонов по заранее подготовленной таблице тестов.

Рисунок 1 – Первый прогон программы

Из рисунка 1 видно, что программа работает корректно, и выводит значения, которые были запланированы в таблице тестов. Проведем более детальные прогоны программы, что бы удостовериться в том, что процедура поиска простых чисел ‘filtr’ работает корректно, а так же проверим программу на устойчивость с помощью предельных значений ОДЗ.

 

X[10] Y[12] кол-во простых чисел в массиве Х кол-во простых чисел в массиве Y Назначение теста
200, 80, 81, 124, 525, 75, 76, 77, 44, 10 4, 6, 8, 9, 12, 15, 18, 20, 24, 27, 100, 0 Нет простых чисел

Рисунок 2 – Второй прогон программы

Из рисунка 2 видно, что программа правильно распознает сложные числа. Проведем следующий прогон программы, в котором все числа будут простыми:

X[10] Y[12] кол-во простых чисел в массиве Х кол-во простых чисел в массиве Y Назначение теста
1, 2, 3, 7, 11, 13, 17, 19, 23, 29 617, 461, 601, 727, 557, 983, 929, 881, 673, 509, 661, 283 Все числа простые

 

Рисунок 3 – Третий прогон программы

Из рисунка 3 видно, что программа правильно распознает простые числа. Из рисунков 2, 3 можно сделать вывод, что процедура поиска простых чисел ‘filtr’ работает корректно. Проведем следующий прогон программы с предельными значениями ОДЗ:

X[10] Y[12] кол-во простых чисел в массиве Х кол-во простых чисел в массиве Y Назначение теста
-32768, -32767, -32766, -32765, -32764, -32763, -32762, -32761, -32760, -32759 32767, 32766, 32765, 32764, 32763, 32762, 32761, 32760, 32759, 32758, 32757, 32749 Предельные значения ОДЗ

Рисунок 4 – Четвертый прогон программы

Из рисунка 3 видно, что программа корректно работает с большими числами, однако скорость работы с большими числами на эмуляторе достаточно низкая, поэтому стоит добавить в процедру ‘filtr’ проверку чисел на четность/нечетность:

 

mov dx, 0; обнуляем dx

mov cx, 2

cwd

idiv cx; делим элемент массива на 2

cmp dx, 0

je m4; если после деления нет отстатка, то число четное, переходим к следующему элементу

 

Теперь программа отбрасывает все четные числа, что заметно увеличивает скорость работы программы с большими числами.

 

Заключение

Во время написания курсового проекта я научился работать с массивами, добавлять массивы в процедуры, адаптировать код программы для повышения эффективности её работы, а так же узнал и использовал возможности регистра dx.


 

Список литературы

1. П. Абель Язык ассемблера для IBM PC и программирования. М. «Высшая школа», 1992, 447с.

2. Гук Михаил Процессоры Intel: от 8086 до Pentium II: Архитектура. Интерфейс. Программирование / М. Гук. - СПб. и др.: Питер, 1998. - 220с.

3. Бек Л. Введение в системное программирование. - М.: Мир, 1988

4. Пирогов В. Ассемблер в примерах. – Спб: БХВ, 2005. – 416 с.

5. Пильщиков В.Н. Программирование на языке ассемблера IBM PC. – М.: «Диалог-МИФИ», 1999. – 288 с.

6. Юров В. Assembler: Спец. справ. / В. Юров. - СПб. и др.: Питер, 2000. - 489с.: ил.

 


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-03-17; Просмотров: 1601; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.024 с.)
Главная | Случайная страница | Обратная связь