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


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; Просмотров: 15; Нарушение авторского права страницы


lektsia.com 2007 - 2017 год. Все права принадлежат их авторам! (0.085 с.) Главная | Обратная связь