Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
mov cx, 10;Размер масива(Счетчик) ⇐ ПредыдущаяСтр 2 из 2
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
Протокол работы программы
Для того, чтобы убедиться в правильности написанного кода и работе программы проведем несколько прогонов по заранее подготовленной таблице тестов. Рисунок 1 – Первый прогон программы Из рисунка 1 видно, что программа работает корректно, и выводит значения, которые были запланированы в таблице тестов. Проведем более детальные прогоны программы, что бы удостовериться в том, что процедура поиска простых чисел ‘filtr’ работает корректно, а так же проверим программу на устойчивость с помощью предельных значений ОДЗ.
Рисунок 2 – Второй прогон программы Из рисунка 2 видно, что программа правильно распознает сложные числа. Проведем следующий прогон программы, в котором все числа будут простыми:
Рисунок 3 – Третий прогон программы Из рисунка 3 видно, что программа правильно распознает простые числа. Из рисунков 2, 3 можно сделать вывод, что процедура поиска простых чисел ‘filtr’ работает корректно. Проведем следующий прогон программы с предельными значениями ОДЗ:
Рисунок 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; Просмотров: 1659; Нарушение авторского права страницы