Блок схема главной программы




ИРКУТСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ

ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Заочно-вечерний факультет

Кафедра вычислительной техники

 

Допускаю к защите

Руководитель Л.Л.Куликова

подпись, И.О. Фамилия

 

Модульное программирование на Ассемблере.

 

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту по дисциплине

«Машинно-ориентированные языки»

 

1.005.00.00 ПЗ

 

Разработал студент группы ЭВМбз-12-1     А.И. Помазков
подпись   И. О. Фамилия
       
   
       
Нормоконтроль     Л.Л.Куликова
подпись   И. О. Фамилия

 

Курсовой проект защищен с оценкой ____________________________________

 

 

Иркутск 2016


 

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное
учреждение высшего образования

ИРКУТСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

 

ЗАДАНИЕ

НА КУРСОВОЕ ПРОЕКТИРОВАНИЕ

 

По курсу Машинно-ориентированные языки
Студенту Помазкову Антону Ивановичу
Тема проекта: Модульное программирование на Ассемблере
     

 

Исходные данные:

Заданы два массива X[10] и Y[12], состоящих из целых чисел со знаком в формате слова. Составить процедуру нахождения наибольшего по абсолютной величине элемента массива. Передача параметров через регистры

ВХ – смещение массива;

в СХ – число элементов в массиве;

в АХ – результат вычислений.

 

Рекомендуемая литература:

1.Юров В.И. Assembler: учеб. пособие для вузов по направлению подгот. дипломир. специалистов «Информатика и вычисл. техника» / В. И. Юров. – 2-е изд.. – СПб.и др.: Питер, 2004. – 636 с.
2. Одиноков В. В. Программирование на ассемблере: учебное посо- бие по специальностям: 090105 «Комплексное обеспечение информац. безопасности автоматизированных систем», 090102 «Компьютер. безопас- ность», 090106 / В. В. Одиноков, В. П. Коцубинский. – Москва: Горячая линия – Телеком, 2011.
3. Юров В. Assembler: Спец. справ. / В. Юров. - СПб. и др.: Питер, 2000. - 489с.: ил.
4. Аблязов Р.З. Программирование на ассемблере на платформе x86- 64. - ДМК Пресс, 2011. - 304 с. (https://e.lanbook.com/books/element.php? pl1_id = 1273)
5. Зубков С.В. Assembler. Для DOS, Windows и Unix. Изд-во "ДМК Пресс", 2008 (https://e.lanbook.com/books/element.php?pl1_cid= 25&pl1_id= 1243)

 

 

Дата выдачи задания «28» марта 2015 г.

Задание получил А.И. Помазков

Дата представления проекта руководителю «12» марта 2016 г.

 

Руководитель курсового проектирования: Л.Л.Куликова


СОДЕРЖАНИЕ

 

СОДЕРЖАНИЕ. 3

ВВЕДЕНИЕ. 4

1 Цель курсового проекта. 5

2 Анализ задачи. 5

3 Математическая модель. 5

4 Входные данные. 6

5 Таблица тестов. 7

6 Схема иерархии процедур. 8

7 Спецификация модулей. 8

8 Описание процедур. 9

9 Блок схема главной программы.. 16

10 Листинг программы.. 18

ЗАКЛЮЧЕНИЕ. 28

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ.. 29

 


ВВЕДЕНИЕ

Задачей данного курсового проекта является получение навыков разработки структурной организации ассемблерных программ и их реализация в виде модульных программ на основе аппарата процедур. Изучение способов организации связи по данным. Закрепление навыков программирования на машинно-ориентированном языке и разработка эффективных программ с использованием машинных ресурсов.

В ходе работы будет написана программа на ассемблере микропроцессора i8086. Для этого будут использованы приобретенные знания и навыки работы на машинно-ориентированных языках, понимание принципов работы микропроцессоров и эмуляторов из курса «Машинно-ориентированные языки».

Программный комплекс будет разрабатываться на эмуляторе emu8086. Данный эмулятор запускает программы, как реального микропроцессора в поэтапном режиме. Он показывает регистры, памяти, стека, переменных и флагов. Инструкции могут быть выполнены в очередные направления вперед, а также в обратном направлении. Идеально подходит для поставленных задач курсового проекта.

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

 

 

Цель курсового проекта

 

· Получение навыков разработки структурной организации ассемблерных программ.

· Реализация модульных программ на основе аппарата процедур.

· Изучение способов организации связи по данным.

· Закрепление навыков программирования на машинно-ориентированном языке.

· Разработка эффективных программ с использованием машинных ресурсов.

 

Анализ задачи

В ходе выполнения курсового проектирования необходимо разработать программный комплекс для ввода данных об элементах двух массивов X[10] и Y[12] с клавиатуры. Данные массивы должны состоять из целых чисел со знаком в формате слова. Для обработки массивов нужно написать процедуру нахождения наибольшего по абсолютной величине элемента массива. При этом передача параметров должна проводиться через регистры:

ВХ – смещение массива;

СХ – число элементов в массиве;

АХ – результат вычислений.

Программа, полученная для выполнения данного условия, должна быть модульная. Поэтому ее необходимо реализоваться с помощью процедур(модулей). Разделение программы на отдельные фрагменты (модули), которые просты по управлению и допускают независимую отладку и тестирование, позволяет нам спокойно работать над отдельной частью большой системы, не заботясь обо всех ее деталях.

Математическая модель

Массив ‑ составной тип данных. Массив состоит из фиксированного числа элементов одинакового типа. Число элементов массива N фиксируется при описании типа и при исполнении программы не меняется.

Алгоритм поиска максимального элемента массива

Поле для искомого максимума обозначим Max.

Сначала делается предположение, что первый элемент массива является максимальным: MAX: =x[1];

Затем остальные элементы массива последовательно сравниваются с величиной MAX. Если во время очередной проверки обнаруживается, что проверяемый элемент больше MAX, то этот элемент становится максимальным.

Если max<x[i], то max:=x[i]. Продолжается проверка оставшихся элементов: i =i+1 пока I<=N.

Входные данные

В программе необходимо выделить память для двух массивов и обеспечить вывод максимальных элементов этих массивов. Тип и ОДЗ используемых переменных заданы в таблице 1.

Таблица 1 – Таблица внешних спецификаций

 

Имя Назначение Тип ОДЗ
  X Массив X(10) Целый, DW [-32768…32767]
  Y Массив Y(12) Целый, DW [-32768…32767]
  искомое Максимальный элемент в массиве Х Целый, DW [-32768…32767]
  искомое Максимальный элемент в массиве Y Целый, DW [-32768…32767]

 

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

TaskAndAvtor – Вывод сообщения о задание и авторе.

TextVvodMass_01 - Введите первый массив X[10]:

TextVvodMass_02 - Введите второй массив Y[12]:

TextVvodAlement - Введите элемент массива

TextVivodMass_01 - Массив введен успешно

TextVivodMass_02 - Введённый вами массив:

TextVivodMaxMass - Максимальный элемент данного массива равен

TextClear - Нажмите Enter, что бы очистить экран и продолжит работу со вторым массивом

probel – Для организации пробела между элементами массива при выводе их на экран.

 

Таблица тестов

Вводимые данные Результат Комментарии  
  Х [10] = [5 0 5 99 0 40 0 0 7 7] Y [12] = [13 6 44 4 8 33 20 53 66 17 0 96] Максимальный элемент массива будет равен: Max X = 99 Max Y =96 Проверка программы на нахождение максимального числа среди только положительных чисел.  
  X [10] = [10 20 -30 -40 50 60 -70 -80 -90 -100] Y [12] = [-11 - 8 - 2 - 4 - 10 - 22 - 25 - 13 - 14 - 47 - 28 - 49] Максимальный элемент массива будет равен: Max X= 60 Max Y=-2 Проверка программы на нахождение максимального элемента массива среди, как положительных, так и отрицательных чисел.  
  X [10] = [10 20 30 40 50 60 70 80 99999 100] Y [10] = [43567 7458 32323 12121 3434 44 0 45 5 6 7 8]     X [10] = [10 20 30 40 50 60 70 80 9999 100] Max X = 9999(99999) Y [10] = [-21696 7458 32323 12121 3434 44 0 45 5 6 7 8] Max Y=32323 Ввод числа, выходящего из ОДЗ, приводит к некорректному выводу полученного массива, что влияет на полученный результат.
  X [10] = [3 3 3 3 3 3 3 3 3 3] Y [10] = [-7 -7 -7 -7 -7 -7 -7 -7 -7 -7 -7 -7]     Максимальный элемент массива будет равен: Max X= 3 Max Y=-7 Проверка программы когда все элементы массива одинаковые.

 

Схема иерархии процедур

Иерархия модулей программы показана на рисунке 1.

 

Рисунок 1 – Иерархия модулей

 

Спецификация модулей

 

Информация о модулях программы представлена в таблице 2.

Таблица 2 - Спецификация модулей

 

Имя Назначение Тип п.п
  Main Главный модуль Главная программа
  VvodMasiva Ввод массива Процедура
  VivodMasiva Вывод массива на экран Процедура
  Print_t Вывод текста на экран Процедура
  MaxMasiva Нахождение максимального элемента массива Процедура
  Var_01 Задание смешения и количества элементов массива X Процедура
  Var_02 Задание смешения и количества элементов массива Y Процедура

 

 

Описание процедур

Определимся с названиями модулей и их назначением. В программном комплексе будут использованы следующие модули:

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

MaxMasiv – модуль поиска наибольшего элемента одномерного массива. Обращается к модулям prin_t и print_num. Алгоритм данного модуля в виде блок схемы представлен на рисунке 2.

Входные данные:

сx –количество элементов массива;

bx – адрес вводимого массива.

Выходные данные:

ax – Значение максимального элемента массива

Ниже приведен код на ассемблере данной процедуры.

MaxMasiv proc near

mov ax, [bx]

M3:

push cx

cmp ax, [bx]

jg next

mov ax, [bx]

next:

add bx, 2

pop cx

dec cx

jnz M3

 

push ax

lea dx, TextVivodMaxMass

call print_t

pop ax

call print_num

ret

MaxMasiv endp

 

 

Рисунок 2 – Блок схема модуля MaxMasiv

VivodMasiva – модуль вывода на экран терминала полученного массива. Также данная процедура вызывает модуль prin_t для реализации пробелов между элементами массивов при выводе их на экран.

Входные данные:

сx –количество элементов массива;

bx – адрес вводимого массива.

Ниже приведен код на ассемблере данной процедуры.

VivodMasiva proc near

cikl1:

push cx

mov ax, [bx]

call print_num

lea dx, probel

call print_t

add bx, 2

pop cx

dec cx

jz M2

jmp cikl1

M2:

mov ax, [bx]

ret

VivodMasiva endp

Алгоритм реализации данного кода в виде блок схемы представлен на рисунке 3.

Рисунок 3 – Блок схема модуля VivodMasiva

 

VvodMasiva – модуль необходимдля реализации ввода с клавиатуры элементов массивов X[10], Y[12]. Данный модуль также использует процедуру print_t для вывода различных сообщений пользователю.

Входные данные:

сx –количество элементов массива;

bx – адрес вводимого массива.

Ниже приведен код на ассемблере данной процедуры.

VvodMasiva proc near

repeat:

push cx

lea dx, TextVvodAlement

call print_t

call scan_num

mov [bx], cx

add bx, 2

pop cx

dec cx

jz M4

jmp repeat

M4: lea dx, TextVivodMass_01

call print_t

lea dx, TextVivodMass_02

call print_t

ret

VvodMasiva endp

Алгоритм реализации данной процедуры в виде блок схемы представлен на рисунке 4.

Рисунок 4 – Блок схема модуля VvodMasiva

 

print_t - процедура для вызова девятой функции двадцать первого прерывания. Назначение: вывод текстовых сообщений на экран, заканчивающихся символом $.

Код на ассемблере данной процедуры показан ниже.

print_t proc near

mov ah,9

int 21h

ret

print_t endp

Алгоритм реализации данной процедуры в виде блок схемы представлен на рисунке 5.

Рисунок 5 – Блок схема модуля Print_t

Var_01 и Var_02 – предназначены для записи в регистры cx и bx информации о количестве элементов массива и адреса вводимого массива. Код на ассемблере данной процедуры показан ниже.

 

Var_02 proc near

mov cx, 12

mov bx, offset y

ret

Var_02 endp

 

 

Блок схема главной программы

 

 

Рисунок 6 – Блок схема главного модуля

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

Листинг программы

include 'emu8086.inc'

#make_EXE#

 

a_data segment para

TaskAndAvtor db 10,13, 'Автор программы: Помазков Антон Иванович гр. ЭВМбз-12-1',10,13,

db 10,13, 'Задание:',10,13

db 10,13, 'Заданы два массива X[10] и Y[12],состоящих из целых чисел со знаком.'

db 10,13, 'Найти наибольшие по абсолютной величине эле-менты этих массивов.',10,13,'$'

TextVvodMass_01 db 10,13,'Введите первый массив X[10]:$'

TextVvodMass_02 db 10,13,'Введите второй массив Y[12]:$'

TextVvodAlement db 10,13,'Введите элемент массива $'

TextVivodMass_01 db 10,13,'Массив введен успешно $'

TextVivodMass_02 db 10,13,'Введеный вами масив: $'

TextVivodMaxMass db 10,13,'Максимальный элемент данного массива равен $'

TextClear db 10,13,'Нажмите Enter,что бы очистить экран и продолжит работу со вторым массивом.$'

probel db ' $'

X dw 10 dup(?)

Y dw 12 dup(?)

a_data ends

 

a_stack segment para stack

dw 128 dup(?)

a_stack ends

 

a_code segment para

assume cs:a_code, ss:a_stack, ds:a_date

Main:

mov ax, a_data

mov ds,ax

 

lea dx, TaskAndAvtor

call print_t

 

lea dx, TextVvodMass_01

call print_t

call Var_01

call VvodMasiva

 

call Var_01

call VivodMasiva

 

call Var_01

call MaxMasiv

 

lea dx, TextClear

call print_t

call scan_num

call clear_screen

 

lea dx, TaskAndAvtor

call print_t

 

lea dx, TextVvodMass_02

call print_t

call Var_02

call VvodMasiva

 

call Var_02

call VivodMasiva

 

call Var_02

call MaxMasiv

 

mov ah, 4ch

int 21h

 

Var_01 proc near

mov cx, 10

mov bx, offset x

ret

Var_01 endp

 

Var_02 proc near

mov cx, 12

mov bx, offset y

ret

Var_02 endp

 

print_t proc near

mov ah,9

int 21h

ret

print_t endp

 

MaxMasiv proc near

mov ax, [bx]

M3:

push cx

cmp ax, [bx]

jg next

mov ax, [bx]

next:

add bx, 2

pop cx

dec cx

jnz M3

 

push ax

lea dx, TextVivodMaxMass

call print_t

pop ax

call print_num

ret

MaxMasiv endp

 

VivodMasiva proc near

cikl1:

push cx

mov ax, [bx]

call print_num

lea dx, probel

call print_t

add bx, 2

pop cx

dec cx

jz M2

jmp cikl1

M2:

mov ax, [bx]

ret

VivodMasiva endp

 

VvodMasiva proc near

repeat:

push cx

lea dx, TextVvodAlement

call print_t

call scan_num

mov [bx], cx

add bx, 2

pop cx

dec cx

jz M4

jmp repeat

M4: lea dx, TextVivodMass_01

call print_t

lea dx, TextVivodMass_02

call print_t

ret

VvodMasiva endp

 

a_code ends

define_clear_screen

define_scan_num

define_print_num

define_print_num_uns

end Main

Отладка программы

Тестировать программу будем исходя из таблицы тестов, что было раннее приготовлено. В первом тесте проверим, как программа будет работать только с положительными числами. Заносим данные программу исходя из таблицы 3.

Таблица 3 – Тест 1

Вводимые данные Результат Комментарии
  Х [10] = [5 0 5 99 16 40 9 4 7 7] Y [12] = [13 6 44 4 8 33 20 53 66 17 0 96] Max X – 99 Max Y – 96 Проверка программы на нахождение максимального числа среди только положительных чисел.

Рисунок 7 – Тест 1. Работа с первым массивом

 

Рисунок 8 – Тест 1. Работа со вторым массивом

Исходя из рисунков 7 и 8, можно сделать вывод о правильности работы программы с положительными числами. Проверим, как программа работает с отрицательными числами, для этого проведем второй прогон используя данные таблицы 4.

 

 

Таблица 4 – Тест 2

Вводимые данные Результат Комментарии
  X [10] = [10 20 -30 -40 50 60 -70 -80 -90 -100] Y [12] = [-11 - 8 - 2 - 4 - 10 - 22 - 25 - 13 - 14 - 47 - 28 - 49] Max X – 60 Max Y - -2 Проверка программы на нахождение максимального элемента массива среди, как положительных, так и отрицательных чисел.

Рисунок 9 – Тест 2. Работа с первым массивом

Рисунок 10 – Тест 2. Работа со вторым массивом

Программа также выполнилась правильно. Результат ее работы изображены на рисунке 9 и 10. Проверим реакцию программ на число больше ее ОДЗ. Для этого проведем последний тест, используя данные таблицы 5.

Таблица 5 – Тест 3

Вводимые данные Результат Комментарии  
  X [10] = [10 20 30 40 50 60 70 80 99999 100] Y [10] = [43567 7458 32323 12121 3434 44 0 45 5 6 7 8]     X [10] = [10 20 30 40 50 60 70 80 9999 100] Max X = 9999(99999) Y [10] = [-21696 7458 32323 12121 3434 44 0 45 5 6 7 8] Max Y=32323 Ввод числа, выходящего из ОДЗ, приводит к некорректному выводу полученного массива, что влияет на полученный результат.

Рисунок 11 – Тест 3

Рисунок 12 – Тест 3. Вывод второго массива

 

Как видно из рисунков 11 и 12 ввод числа, выходящего из ОДЗ, приводит к некорректному выводу полученного массива, что влияет на полученный результат. Последним прогоном проверим как программа будет работать, когда будут введены одинаковые символы.

 

Вводимые данные Результат Комментарии  
  X [10] = [3 3 3 3 3 3 3 3 3 3] Y [10] = [-7 -7 -7 -7 -7 -7 -7 -7 -7 -7 -7 -7]     Максимальный элемент массива будет равен: Max X= 3 Max Y=-7 Проверка программы когда все элементы массива одинаковые.

 

Рисунок 13 – Тест 4. Вывод первого массива с одинаковыми положительными числами

Рисунок 14 – Тест 4. Вывод второго массива с одинаковыми отрицательными числами

Как видно из рисунков 13 и 14, программа выдает правильный результат при вводе в массив одинаковых чисел, как положительных, так и отрицательных.

 


ЗАКЛЮЧЕНИЕ

Ассемблер является символическим аналогом машинного языка. По этой причине программа, написанная на ассемблере, должна отражать все особенности архитектуры микропроцессора: организацию памяти, способы адресации операндов, правила использования регистров и т.д. Из-за необходимости учета подобных особенностей ассемблер уникален для каждого типа микропроцессоров. Для работы в данном курсовом проекте использовалась программа emu8086, которая эмулирует работу микропроцессора i8086, под который и был написан программный комплекс.

Курсовой проект выполнен полностью, программа отлажена и протестирована с помощью составленной заранее таблице тестов.

В процессе работы над проектом были получены навыки модульного программирования на языке ассемблера, изучено использование процедур, использованы знание типовых алгоритмов из курса "Программирование на Языках Высокого Уровня". Были составлены процедуры, нахождения максимального элемента массива, ввода массива с клавиатуры, вывода на экран и процедура вывода текста.

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: