Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
ИРКУТСКИЙ НАЦИОНАЛЬНЫЙ
ИССЛЕДОВАТЕЛЬСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Курсовая работа
ТЕМА
Модульное программирование на Ассемблере
по дисциплине
"Машинно-ориентированные языки"
.024.00.00 ПЗ
Иркутск 2015
Заданы два массива X [10] и Y [12], состоящих из целых чисел со знаком в формате слова. Выполнить над массивами действия согласно индивидуальному заданию.
Программа должна иметь модульную структуру. Выделить процедуры: ввода массива с консоли, вывода массива, вывода информации об авторе и условии решенной задачи. Выполнить вывод массивов на экран до обработки и после обработки согласно варианту.
Составить процедуру, которая уменьшает в два раза элементы с четными положительными значениями и заменяет нулевые элементы на - 10. Передача параметров через регистры:
в ВХ - смещение массива;
в СХ - число элементов в массиве.
Содержание
Исходные данные
Введение
1. Цель курсового проекта
2. Математическая модель
3. Таблица внешних спецификаций
4. Таблица тестов
5. Иерархия процедур. Назначение модулей
6. Описание процедур
7. Блок схемы
8.1 Блок-схема основной программы
8.2 Блок-схема процедуры Full
8.3 Блок-схема процедуры Proc_zam
8.4 Блок-схема процедуры Write_array
8.5 Блок-схема процедуры Input_array
8. Реализация программы на Ассемблере
9. Разработка программы на Ассемблере
10. Трансляция и преобразование кода программы KP
11. Протокол тестирования программы на основе Таблицы тестов
Заключение
Список использованных источников
Модульное программирование - это такой способ программирования, при котором вся программа разбивается на группу компонентов, называемых модулями, причем каждый из них имеет свой контролируемый размер, четкое назначение и детально проработанный интерфейс с внешней средой. Единственная альтернатива модульности - монолитная программа, что, конечно, неудобно. Таким образом, наиболее интересный вопрос при изучении модульности - определение критерия разбиения на модули.
Преимуществом указанной технологии является возможность разработки программ большого объема небольшими функционально законченными частями. При этом многие процедуры можно использовать в других местах программы или других программах, не прибегая к переписыванию частей программного кода. Дополнительные возможности предоставляет применение при разработке подпрограмм, написанных на различных языках программирования, как высокого, так и низкого уровней. При этом используются преимущества языка программирования, который дает наиболее эффективную реализацию алгоритма подпрограммы. Так, включение модулей, написанных на языке ассемблера, позволяет ускорить выполнение соответствующих частей программы и/или выполнить действия, программирование которых с использованием языков высокого уровня невозможно или затруднительно. С другой стороны, существует много библиотек подпрограмм на языках высокого уровня, которые с успехом можно использовать в ассемблерных программах.
модульное программирование модуль процедура
Целью выполнения данного курсового проекта является:
· Получение навыков разработки структурной организации ассемблерных программ.
· Реализация модульных программ на основе аппарата процедур.
· Изучение способов организации связи по данным.
· Закрепление навыков программирования на машинно-ориентированном языке.
· Разработка эффективных программ с использованием машинных ресурсов.
Поэлементно работаем с массивами X и Y:
В случае если элемент X [0.10] =0, то заменяем X [0.10] на число - 10.
В случае если элемент Y [0.12] =0, то заменяем Y [0.12] на число - 10
В случае если элемент X [0.10] >0, то делим значение на два X [0.10] = X [0.10] /2
В случае если элемент Y [0.12] >0, то делим значение на два Y [0.12] = Y [0.12] /2
При целочисленном делении числа на два, остаток от деления (регистр DX) равно 0.
|
№ |
Имя |
Назначение |
Тип |
ОДЗ |
|
1 |
X |
Массив X (10) |
DW |
[-32768…32767] |
|
2 |
Y |
Массив Y (12) |
DW |
[-32768…32767] |
|
№ |
Вводимые данные |
Результат |
Комментарии |
Х [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] |
Х [10] = [5 - 10 5 99 - 10 20 - 10 - 10 7 7] Y [12] = [13 3 22 2 4 33 10 53 33 17 - 10 48] |
В Х четыре элемента равных 0 были заменены на - 10 В массиве Y семь положительных четных элементов были разделены на 2, один элемент равный 0 заменен на - 10 |
|
|
2 |
X [10] = [0 0 0 0 0 0 0 0 0 0] Y [12] = [-11 - 8 - 2 - 4 - 10 - 22 - 25 - 13 - 14 - 47 - 28 - 49] |
X [10] = [-10 - 10 - 10 - 10 - 10 - 10 - 10 - 10 - 10 - 10] Y [12] = [-11 - 8 - 2 - 4 - 10 - 22 - 25 - 13 - 14 - 47 - 28 - 49] |
В массиве Х все элементы равные 0 было заменены на число - 10 В массиве Y элементы не были изменены, т.к. они все меньше 0, либо нечетные и меньше 0 |
|
|||
|
3 |
X [10] = [10 20 30 40 50 60 70 80 90 100] Y [12] = [-10 - 20 - 30 - 40 - 50 - 60 - 70 - 80 - 90 - 100 - 110 - 120] |
X [10] = [5 10 15 20 25 30 35 40 45 50] Y [12] = [-10 - 20 - 30 - 40 - 50 - 60 - 70 - 80 - 90 - 100 - 110 - 120] |
В массиве Х все четные положительные элементы были разделены на 2 В массиве Y четные элементы не были заменены, т.к. они все меньше 0 |
||||
|
4 |
X [10] = [-3 - 5 - 7 - 9 - 11 - 13 - 15 - 177 - 1999 - 21] Y [12] = [3 5 11 23 27 25 31 47 19 13 49 21] |
X [10] = [-3 - 5 - 7 - 9 - 11 - 13 - 15 - 177 - 1999 - 21] Y [12] = [3 5 11 23 27 25 31 47 19 13 49 21] |
В массиве Х ни один элемент не был изменен, т.к. они все нечетные и меньше 0 В массиве Y ни один элемент не был изменен, т.к. все элементы нечетные |
||||
|
№ |
Название |
Тип |
Назначение |
|
1 |
Prog |
Главная программа |
Основной модуль программы |
|
2 |
about |
Процедура |
Процедура вывода информации о задании и студенте |
|
3 |
Full |
Процедура |
Процедура обработки массива |
|
4 |
Write_int |
Процедура |
Процедура вывода числа на экран |
|
5 |
Input_array |
Процедура |
Процедура ввода массива с клавиатуры |
|
6 |
Write_array |
Процедура |
Процедура вывода на экран массива |
|
7 |
Read_int |
Процедура |
Процедура ввода числа с клавиатуры |
|
8 |
Proc_zam |
Процедура |
Процедура уменьшает в два раза элементы с четными положительными значениями и заменяет нулевые элементы на - 10 |
Процедура Full:
Процедура предназначена для сокращения основного модуля программы. Так как дано два массива и действия для них идентичны (Ввод, вывод, замена значений в массиве), то будет правильным составить для них процедуру повторяющихся действий.
Входящие данные:- размер массива (в нашем случает 10 для Х и 12 для Y)- дублирующий размер массива, для корректных повторных работ с массивами- прямой адрес массива
Процедура write_int:
Процедура вывода числа
Входные данные:
Ах - число, которое нужно вывести на экран
Процедура read_int:
Процедура ввода числа
Выходные данные:
Ах - число, которое вводится с клавиатуры
Процедура Input_array
Процедура ввода массива.
Входные данные:
Cx - количество элементов массива
Bx - адрес вводимого массива
Процедура Write_array
Вывод элементов массива на экран Входные данные:
Cx - количество элементов массива
Процедура Proc_Zam
Процедура сравнения элементов массива с поставленными условиями уменьшает в два раза элементы с четными положительными значениями и заменяет нулевые элементы на - 10. Для работы данной процедуры необходимы регистры АХ и ВХ, поэтому для сохранения их значений, перед действиями над регистрами, их значения помещаются в стек, а после завершения всех операций значения помещаются обратно.
Входные данные:- адрес начального элемента обработки
Сx - количество элементов массива
Bx - Адрес обрабатываемого массива
Рисунок 1 - Листинг программы, начало
Рисунок 2 - Листинг программы, продолжение
Рисунок 3 - Листинг программы, окончание
Ассемблер - машинно-ориентированный язык программирования, полностью отражающий архитектуру конкретного микропроцессора и содержащий мнемонические обозначения машинных команд.
Программа, написанная на Ассемблере, представляет собой исходный текст, для обработки которого будем использовать известный транслятор Turbo Assembler (TASM).
Разработка программы на Ассемблере состоит из следующих этапов:
) Составление алгоритма в виде блок-схемы или структурного описания,
) Ввод в ЭВМ текста исходной программы <name>. asm с помощью редактора текстов. Имя name может быть произвольным, а расширение. asm - обязательно,
) Перевод (трансляция или ассемблирование) исходной программы в машинные коды с помощью транслятора TASM. EXE. На этом этапе получается промежуточный продукт <name>. obj (объектный код). Выявленные при этом синтаксические и орфографические ошибки исправляются повтором пп.2 и 3,4) Преобразование с помощью программы TLINK. EXE объектного кода <name>. obj в исполняемый код <name>. EXE.
) Выполнение программы и ее отладка, если встретились
логические ошибки.
Исходный код программы пишется в текстовом редакторе, который может выводить в файл чистый текст, без управляющих символов. Файл должен иметь расширение". asm".
Трансляция исходного кода программы состоит в преобразовании
предложений исходного языка в коды машинных команд и выполняется с помощью
транслятора на языке ассемблера (т.е. с помощью программы ассемблера). В
результате трансляции образуется объектный файл с расширением". obj". Объектные файл
представляет собой блоки машинного кода и данных, с неопределёнными адресами
ссылок на данные и процедуры в других объектных файлах, а также список своих
процедур и данных.
Рисунок 4 - Трансляция на TASM
Рисунок 5 - Преобразование в. obj на TASM
Рисунок 6 - Запуск исполняемого файла. exe на TASM
Компоновка объектного файла выполняется с помощью программы
компоновщика (редактора связей). Компоновщик собирает код и данные объектного
модуля в итоговую программу. Файл с программой компоновщика корпорации Borland имеет имя "TLINK. EXE".
Рисунок 7 - Тест №1. Тестирование элементов массива X
Рисунок 8 - Тест №1. Тестирование элементов массива Y
Рисунок 9 - Тест №2. Тестирование элементов массива X
Рисунок 10 - Тест №2. Тестирование элементов массива Y
Рисунок 11 - Тест №3. Тестирование элементов массива X
Рисунок 12 - Тест №3. Тестирование элементов массива Y
Рисунок 13 - Тест №4. Тестирование элементов массива X
Рисунок 14 - Тест №4. Тестирование элементов массива Y
Ассемблер является символическим аналогом машинного языка. По этой причине программа, написанная на ассемблере, должна отражать все особенности архитектуры микропроцессора: организацию памяти, способы адресации операндов, правила использования регистров и т.д. Из-за необходимости учета подобных особенностей ассемблер уникален для каждого типа микропроцессоров.
Курсовой проект выполнен полностью, программа отлажена и протестирована.
В процессе работы над проектом получены навыки модульного
программирования на языке ассемблера, изучено различие между процедурами и
макросами, использованы знание типовых алгоритмов из курса "Программирование
на Языках Высокого Уровня". Составлена процедура, которая уменьшает в два
раза элементы с четными положительными значениями и заменяет нулевые элементы
на - 10.
1. П. Абель Язык ассемблера для IBMPC и программирования.М. "Высшая школа", 1992, 447с.
2. Гук Михаил Процессоры Intel: от 8086 до Pentium И: Архитектура. Интерфейс. Программирование / М. Гук. - СПб. и др.: Питер, 1998. - 220с.
. Пирогов В. Ассемблер в примерах. - Спб: БХВ, 2005. - 416 с.
. Пилыциков В.Н. Программирование на языке ассемблера IBMPC. - М.: "Диалог-МИФИ", 1999. - 288 с.
. Финогенов К.Г. Основы языка Ассемблера. - М.: Радио и связь, 2000.
. Юров В. Assembler: Спец. справ. / В. Юров. - СПб. и др.: Питер, 2000. - 489с.: ил.
. Юров В. Assembler. Практикум. - СПб.: Питер, 2001.
. Юров В., Хорошенко В. Assembler - Учебный курс. - СПб.: Питер, 2000.