ИРКУТСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ
ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Заочно-вечерний факультет
Кафедра вычислительной техники
Допускаю к защите
Руководитель Л.Л.Куликова
подпись, И.О. Фамилия
Модульное программирование на Ассемблере.
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту по дисциплине
«Машинно-ориентированные языки»
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, под который и был написан программный комплекс.
Курсовой проект выполнен полностью, программа отлажена и протестирована с помощью составленной заранее таблице тестов.
В процессе работы над проектом были получены навыки модульного программирования на языке ассемблера, изучено использование процедур, использованы знание типовых алгоритмов из курса "Программирование на Языках Высокого Уровня". Были составлены процедуры, нахождения максимального элемента массива, ввода массива с клавиатуры, вывода на экран и процедура вывода текста.