Задания для курсового проектирования




Иркутский государственный технический университет

Факультет кибернетики

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

 

 

МАШИННО-ОРИЕНТИРОВАННЫЕ ЯЗЫКИ

Методические указания к выполнению курсового проекта

ФОРМА ОБУЧЕНИЯ-ЗАОЧНАЯ

 

 

Укрупненная группа направлений и специальностей 230000 «Информатика и вычислительная техника»
Направление подготовки: 230100 «Информатика и вычислительная техника»

 

Специальность: 230101.65 «Вычислительные машины, комплексы, системы и сети»
   
     

 

Составила: Егорова Н.Н., ст. преп. кафедры ВТ

 

Иркутск 2010 г.


Оглавление

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

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

Требования к реализации курсового проекта. 3

Планирование тестов и описание тестов. 3

Требования к содержанию и оформлению проекта. 3

График выполнения и критерии оценки проекта. 4

Задания для курсового проектирования. 4

· Общая часть. 4

· Индивидуальные варианты заданий. 4

Основная учебная литература. 7

Электронные образовательные ресурсы: 7

Методические материалы. 8

Процедуры на ассемблере. 8

Примеры программ с использованием процедур. 12

Пример 1. 12

Пример 2. 12

Текст программы (файл prim2.asm) 14

Технология разработки программ на машинно-ориентированном языке. 16

Основная учебная литература. 17

Электронные образовательные ресурсы.. 17

Приложение №1. Макрокоманды из библиотеки MAC.lib. 18

Приложение №2. 20

Приложение №3. 21

 


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

 

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

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

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

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

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

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

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

 

Требования к реализации курсового проекта

 

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

1. Должен быть обеспечен ввод данных с контролем.

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

3. Вся выводимая информация должна быть на русском языке и отражать терминологию предметной области задачи.

4. Все аварийные ситуации должны завершаться сообщениями, выдаваемыми из программного комплекса, а не из базового программного обеспечения.

Планирование тестов и описание тестов

При планировании тестов необходимо предусмотреть варианты исходных данных для проверки всех развилок программы в нормальных и аварийных ситуациях. В приложении к проекту приводятся результаты работы приложения для каждого теста.

Требования к содержанию и оформлению проекта:

На защиту курсового проекта представляется программа и отчет.

Отчет должен содержать:

1. Титульный лист

2. Задание

3. Обзор литературы.

4. Описание входных и выходных параметров

5. Описание алгоритма

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

7. Контрольные примеры

8. Заключение

9. Список литературы

 

График выполнения и критерии оценки проекта

 

Последовательность выполнения, рекомендации по выполнению разделов проекта:

1. Содержательный анализ задачи.

2. Формализация задачи.

2.1. Определить входные данные, их тип и структуру. Назначить имена.

2.2. Определить входные данные, их структуру.

3. Разработать алгоритм решения задачи и описать его.

(Описание можно проводить либо в виде блок-схемы, либо на псевдоязыке).

4. Разработать программу.

4.1. Описать переменные (как основные, так и промежуточные).

4.2. Закодировать ввод исходных данных и вывод.

4.3. Закодировать полный алгоритм решения.

5. Провести отладку программы.

5.1. составить контрольный пример.

5.2. Отладить программу.

6. Оформить отчет по курсовому проекту.

 

Оценка за курсовой проект складывается из оценки за предоставленный отчет, полноту выполненной работы, работоспособность программы, защиту (ответы на вопросы по теме проекта) и составляет от 2 до 5 («неудовлетворительно», «удовлетворительно», «хорошо», «отлично»).

 

Отчет распечатывается на листах формата А4.

 

Образец титульного листа и задания - в приложении. (Лист с заданием печатается на каждого студента)

 

 

Задания для курсового проектирования

· Общая часть.

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

 

Программа должна иметь модульную структуру. Выделить процедуры: ввода массива с консоли, вывода массива, вывода информации об авторе и условии решенной задачи. Выполнить вывод массивов на экран до обработки и после обработки согласно варианту.

· Индивидуальные варианты заданий

1. Составить процедуру, которая вычисляет число неотрицательных элементов в массиве. Передача параметров через регистры

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

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

в АХ – результат вычислений (число неотрицательных элементов).

2. Составить процедуру вычисления числа элементов в массиве, по абсолютной величине меньших 100. Передача параметров через регистры

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

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

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

3. Составить процедуру вычисления суммы элементов массива, значения которых кратны 3 или 7. Передача параметров через регистры

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

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

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

4. Составить процедуру, которая уменьшает в два раза элементы с четными положительными значениями и заменяет нулевые элементы на -10. Передача параметров через регистры:

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

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

5. Составить процедуру нахождения наибольшего по абсолютной величине элемента массива. Передача параметров через регистры

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

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

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

6. Составить процедуру, которая заменяет нулями элементы, большие по абсолютной величине числа 100. Передача параметров через регистры:

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

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

7. Составить процедуру подсчета числа элементов массива, значения которых простые числа. Передача параметров через регистры:

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

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

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

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

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

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

в АХ – искомый номер элемента.

9. Составить процедуру, которая сортирует элементы в массиве по убыванию методом «пузырька». Передача параметров через регистры:

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

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

10. Составить процедуру вычисления суммы тех элементов в массиве, чьи значения кратны 7. Передача параметров через регистры:

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

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

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

11. Составить процедуру, которая вычисляет сумму неотрицательных нечетных чисел в массиве. Передача параметров через регистры:

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

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

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

12. Составить процедуру подсчета элементов в массиве, по абсолютной величине меньших 80. Передача параметров через регистры:

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

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

в АХ – результат вычислений (число искомых элементов).

13. Составить процедуру подсчета элементов массива, значения которых заключены в пределах от -10 до 10. Передача параметров через регистры:

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

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

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

в АХ – результат вычислений (число искомых элементов).

14. Составить процедуру подсчета числа элементов массива, значения которых являются степенью 2. Передача параметров через регистры:

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

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

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

15. Составить процедуру подсчета суммы элементов массива, значения которых положительны и не делятся на 3. Передача параметров через регистры:

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

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

в АХ – результат вычислений (сумма элементов массива).

16. Составить процедуру количества повторения значения первого элемента в массиве. Передача параметров через регистры:

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

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

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

 

17. Составить процедуру, которая находит наименьший элемент и меняет его местами с первым элементом. Передача параметров через регистры:

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

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

 

18. Составить процедуру, которая уменьшает вдвое отрицательные элементы массива. Передача параметров через регистры:

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

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

19. Составить процедуру подсчета количества элементов, значения которых четные отрицательные числа. Передача параметров через регистры:

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

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

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

20. Составить процедуру, которая сортирует элементы в массиве по возрастанию методом «пузырька». Передача параметров через регистры:

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

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

 

Основная учебная литература

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с.: ил.

 

Электронные образовательные ресурсы:

Ресурсы ИрГТУ, доступные в библиотеке университета и в локальной сети.

Ресурсы сети Интернет

https://lite-programming.ru/


Методические материалы.

Процедуры на ассемблере

Программу, состоящую только из большого числа операторов, называют монолитной.

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

Часто модули программы сами состоят из модулей более низкого уровня, то есть модульная программа имеет иерархическую структуру. Программист пишет основную (главную) программу и несколько подпрограмм. Для общности программу и подпрограммы называют модулями. Модуль имеет одну входную и одну выходную точку. Модуль, в котором записано обращение к другому модулю, называется вызывающим; второй модуль называется вызываемым. Основная программа – это модуль, который вызывается только операционной системой. Каждому модулю присваивается имя, и модульная структура программы изображается в виде иерархической схемы модулей (рис. 1).

Среди множества модулей различают: головной модуль – управляет запуском программного продукта (существует в единственном числе); управляющий модуль обеспечивает вызов других модулей на обработку; рабочие модули выполняют функции обработки; сервисные модули и библиотеки – осуществляют обслуживающие функции.

В работе программного продукта активизируются необходимые программные модули. Управляющие модули задают последовательность вызова на выполнение очередного модуля. Информационная связь модулей обеспечивается либо через общие данные, либо межмодульной передачей данных через переменные обмена, называемые параметрами.

Структурный подход к программированию состоит из трёх частей: нисходящее проектирование, структурное программирование и тестирование.

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

Представление программы в виде иерархии относительно обособленных фрагментов со строго определёнными интерфейсами делает её легко проверяемой и приводит к повышению качества и эффективности программы.

Пример иерархии модулей.

 

Модуль или подпрограмма – это часть программы, оформленная в виде отдельной синтаксической конструкции и снабженная именем.

Любая подпрограмма кроме задания последовательности действий может содержать описание некоторой совокупности локальных объектов – констант, типов, переменных и так далее. Эти объекты предназначены для внутреннего использования внутри этой подпрограммы.

Подпрограмма может быть предназначена для работы с различными данными. Гибкость и универсальность подпрограммного механизма обеспечивают с помощью понятия параметров.

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

 

имя-процедуры PROC [ far или near]

<команды тела процедуры>

RET [n]; обязательная команда возврата

имя-процедуры ENDP

 

Директива PROC указывает начало процедуры. Имя процедуры должно обязательно присутствовать. Параметр у директивы PROC может быть NEAR (близкий) и FAR (дальний). К близкой процедуре можно обращаться только из того сегмента команд, где она описана, и нельзя обращаться из других сегментов, а к дальней процедуре можно обращаться из любых сегментов команд. Имена и метки, описанные в процедуре, не локализуются внутри нее. Конец описания процедуры указывает директива ENDP.

Обычно подпрограммы размещают либо в конце сегмента команд, либо в самом начале этого сегмента - перед той командой, с которой должно начинаться выполнение основной программы. Если имеется несколько подпрограмм, то их обычно размещают последовательно. В больших программах подпрограммы часто размещают в отдельном сегменте.

Подпрограмма может выполняться лишь тогда, когда ее вызовут (к ней обратятся).

Пример оформления модульной программы в одном сегменте кода.

A_code SEGMENT para

Assume cs:a_code, ss:a_stack, ds:a_data

; описание подпрограммы 1

P1 proc near

Команды алгоритма подпрограммы 1

Ret

P1 endp

; описание подпрограммы 2

P2 proc near

Команды алгоритма подпрограммы 2

 

Ret

P2 endp

; начало команд главной программы

Begin: mov ax, a_data

mov ds, ax

Команды алгоритма главной программы

;Вызов подпрограммы 1

Call p1

Команды главной программы

;Вызов подпрограммы 2

Call p2

Команды главной программы

……..

Mov ah, 4ch

Int 21h

A_code ends

End begin; Выполнение начинается командой с меткой begin

 

Вызов процедур осуществляется с помощью команды управления CALL. Адрес процедуры может быть указан явно: call имя_процедуры

Адрес процедуры может быть указан с помощью косвенной адресации:

· CALL [регистр индекса или базы]

· CALL [Имя переменной из сегмента данных]

Примеры:

CALL P1; явный вызов

CALL [BX]; косвенный вызов, адрес процедуры помещен в регистр BX

Механизм исполнения команды CALL в общем виде состоит из двух этапов:

· Содержимое регистра IP помещается в стек, то есть, на вершине стека сохраняется адрес команды, следующей после команды CALL- адрес возврата.

· В регистр IP заносится адрес вызываемой процедуры, и начинает выполняться процедура, выполнение главной программы приостанавливается в это время.

Команда RET осуществляет возврат из процедуры в вызывающий модуль. Содержимое вершины стека (адрес возврата) пересылается в регистр IP, таким образом, управление возвращается в вызывающий модуль. Если была передача параметров через стек, то команда возврата RET должна быть с параметром N. В данном случае возврат сопровождается «выталкиванием » из стека загруженных фактических параметров, занимавших N байтов в стеке. Если главная программа оформлена в виде процедуры, то в директиве END пишется имя главной процедуры: END имя главной процедуры.

A_CODE SEGMENT PARA

P_MAIN PROC FAR

ASSUME ……..

………

RET

P_MAIN ENDP

A_CODE ENDS

End p_main

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

PUSH DS;Cохранение текущего адреса сегмента данных в стеке

XOR AX, AX

PUSH AX

; выполняется инициализация регистра DS

MOV AX, A_ DATA

MOV DS, AX

 

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

 


Примеры программ с использованием процедур.

Пример 1

Вычислить y = K! + 5!, где n<=10.

Алгоритм вычисления факториала оформим процедурой ближнего типа с одним параметром, передаваемым через регистр AX. Результат возвращается в регистре BX.

Схема иерархии модулей имеет вид

 
 

 


Блок-схема главной программы Программа на ассемблере
A_data segment para N DW 7 Y DW? A_data ends A_code SEGMENT para Assume cs:a_code, ss:a_stack, ds:a_data ; описание подпрограммы 1 FAKT PROC NEAR;Заголовок процедуры ; процедура вычисления N! ; регистр AX - входной параметр, значение N. ; регистр BX - возвращаемое значение N!. ; арифметика для чисел БЕЗ знака Push CX; сохранение в стеке регистра CX MOV CX, AX; инициализация счетчика MOV AX, 1; инициализация произведения BODY:; метка начала цикла MUL CX;AX*CX -> AX; вычисляем факториал Loop BodY; CX=CX-1; если CX<>0, переходим на BODY: MOV BX, AX; результат ->BX Pop CX; восстановление регистра CX RET; возврат: IP:= содержимое вершины стека FAKT endp; конец процедуры Main:; Начало главной программы mov AX, A_data Mov DS, Ax MOV AX, N; AX = N CALL FAKT; Вызов процедуры FAKT, адрес возврата – в стек MOV Y, BX; Y = BX (N!) MOV AX, 5; AX = 5 CALL FAKT; Вызов процедуры FAKT, адрес возврата – в стек ADD Y, BX; Y = Y+5! MOV AX, Y; подготовка к выводу Print_Number; макрокоманда вывода числа из регистра AX ; EXIT Mov ah,4ch Int 21h A_code ends End main  

 

Пример 2.

Заданы два массива X[N] и Y[M]> где N <= 10, M<=8. Найти количество четных элементов каждого массива.

    Программа должна иметь модульную структуру. Алгоритмы ввода и вывода массивов выделить в отдельные процедуры. Вычисление количества четных элементов в массиве оформить в виде процедуры. Передача параметров через регистры в ВХ – смещение массива в СХ – число элементов в массиве; в АХ – результат вычислений (число четных элементов массива Блок-схема главного модуля

 

Очень удобно, когда все внешние взаимодействия процедуры в заголовке-комментарии:

“ Информация, необходимая на входе.

“ Возвращаемая информация (изменяемые регистры)

“ Вызываемые процедуры.

“ Используемые переменные (для считывания, записи и т.д.)

В этом случае программа легко читается и понимается не только ее автором.

 



Поделиться:




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

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


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