Язык Ассемблер

Автор: Пользователь скрыл имя, 25 Января 2012 в 12:40, курсовая работа

Описание работы

Целью данного курсового проекта является углубление и закрепление знаний, полученных по дисциплине «Системное программное обеспечение», формирование опыта создания прикладных программ с использованием программного продукта Turbo Assembler, а также изучение системных функций DOS и BIOS и рассмотрение механизма работы их прерываний.

Содержание

Введение 4
1 Теоретическая часть 5
1.1 Язык Ассемблер 5
1.2 Достоинства языка Ассемблер 6
1.3 Недостатки языка Ассемблер 7
1.4 Стек 8
1.5 Система прерываний 10
1.6 Макрокоманды 14
1.7 Этапы разработки программы 16
2 Практическая часть 18
2.1 Постановка задачи 18
2.2 Назначение программы 18
2.3 Наименование программы 18
2.4 Требования к программному обеспечению 18
2.5 Описание структуры программы 18
3 Структура программы 19
4 Используемые технические средства 21
5 Запуск программы 22
Заключение 23
Список использованной литературы

Работа содержит 1 файл

ПЗ_СПО_Родионова_нк.doc

— 293.00 Кб (Скачать)

Аннотация 
 

                  Родионова О.В.

                  Разработка  программы перехвата системного таймера. – Трехгорный: ТТИ НИЯУ МИФИ, ВТ, 2011, 26 л. Библиография литературы - 2 наименования. 

    Данная  пояснительная записка  содержит  описание программы перехвата системного таймера: вывод текущего времени в левом углу экрана.

    Документ  включает в себя: общие сведения, функциональное назначение, описание структуры, используемые технические  средства, и литературу. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

    Содержание 
 

 

      Введение

 
 

     Целью данного курсового проекта является углубление и закрепление знаний, полученных по дисциплине «Системное программное обеспечение»,  формирование опыта создания прикладных программ с использованием программного продукта Turbo Assembler, а также изучение системных функций DOS и BIOS и рассмотрение механизма работы их прерываний.

     В процессе разработки проекта решаются следующие основные задачи:

  1. закрепление, углубление и обобщение знаний, полученных во время обучения по дисциплине «Системное программное обеспечение»;
  2. применение полученных знаний к системному решению типовой задачи по программированию системных функций IBM PC;
  3. получение навыков работы со специальной литературой и навыков программирования на ассемблере.

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

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

 

    

     1 Теоретическая часть

     1.1 Язык Ассемблер

 
 

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

     Основных  неудобств в работе человека с  машинной программой два:

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

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

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

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

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

 

      1.2 Достоинства языка Ассемблер

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

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

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

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

 

      1.3 Недостатки языка Ассемблер

     Большие объёмы кода и большое число дополнительных мелких задач, что приводит к тому, что код становится очень сложно читать и понимать, а следовательно  усложняется отладка и доработка программы, а также трудность реализации парадигм программирования и любых других соглашений, что приводит к сложности совместной разработки.

     Меньшее количество доступных библиотек, их малая совместимость между собой.

Непереносимость на другие платформы (кроме двоично совместимых). 

 

      1.4 Стек

     Стеком  называют область программы для  временного хранения произвольных данных. Разумеется, данные можно сохранять и в сегменте данных, однако в этом случае для каждого сохраняемого на время данного надо заводить отдельную именованную ячейку памяти, что увеличивает размер программы и количество используемых имен. Удобство стека заключается в том, что его область используется многократно, причем сохранение в стеке данных и выборка их оттуда выполняется с помощью эффективных команд push и pop без указания каких-либо имен.

     Стек  традиционно используется, например, для сохранения содержимого регистров, используемых программой, перед вызовом подпрограммы, которая, в свою очередь, будет использовать регистры процессора "в своих личных целях". Исходное содержимое регистров извлекается из стека после возврата из подпрограммы. Другой распространенный прием - передача подпрограмме требуемых ею параметров через стек. Подпрограмма, зная, в каком порядке помещены в стек параметры, может забрать их оттуда и использовать при своем выполнении.

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

     Элементы  стека располагаются в области  памяти, отведенной под стек, начиная со дна стека (т.е. с его максимального адреса) по последовательно уменьшающимся адресам. Адрес верхнего, доступного элемента хранится в регистре-указателе стека SP. Как и любая другая область памяти программы, стек должен входить в какой-то сегмент или образовывать отдельный сегмент. В любом случае сегментный адрес этого сегмента помещается в сегментный регистр стека SS. Таким образом, пара регистров SS:SP описывают адрес доступной ячейки стека: в SS хранится сегментный адрес стека, а в SP - смещение последнего сохраненного в стеке данного (рисунок 1). Обратите внимание на то, что в исходном состоянии указатель стека SP указывает на ячейку, лежащую под дном стека и не входящую в него. 

 

Рисунок 1 – Организация стека 

     На  рисунке 1 изображено следующее:

     а - исходное состояние стека;

     б - после загрузки одного элемента (в  данном примере - содержимого рег. АХ);

     в - после загрузки второго элемента (содержимого регистра DS);

     г - после выгрузки одного элемента;

     д - после выгрузки двух элементов и возврата в исходное состояние (указатель стека SP указывает на ячейку, лежащую под дном стека и не входящую в него).

     Загрузка  в стек осуществляется специальной  командой работы со стеком push (протолкнуть). Эта команда сначала уменьшает на 2 содержимое указателя стека, а затем помещает операнд по адресу в SP. Если, например, мы хотим временно сохранить в стеке содержимое регистра АХ, следует выполнить команду push АХ.

     Стек  переходит в состояние, показанное на рисунке 2 - б. Видно, что указатель  стека смещается на два байта  вверх (в сторону меньших адресов) и по этому адресу записывается указанный в команде проталкивания операнд. Следующая команда загрузки в стек, например, push DS переведет стек в состояние, показанное на рисунке 2 - в. В стеке будут теперь храниться два элемента, причем доступным будет только верхний, на который указывает указатель стека SP. Если спустя какое-то время нам понадобилось восстановить исходное содержимое сохраненных в стеке регистров, мы должны выполнить команды выгрузки из стека pop (вытолкнуть):  pop DS и pop AX.

     Состояние стека после выполнения первой команды  показано на рисунке 2 – г (элемент DS уже выгружен), а после второй - на рисунке 2 – д (выгружены оба элемента, и указатель стека SP указывает на ячейку, лежащую под дном стека и не входящую в него). Для правильного восстановления содержимого регистров выгрузка из стека должна выполняться в порядке, строго противоположном загрузке - сначала выгружается элемент, загруженный последним, затем предыдущий элемент и т.д. Совсем не обязательно при восстановлении данных помещать их туда, где они были перед сохранением. Например, можно поместить в стек содержимое DS, а извлечь его оттуда в другой сегментный регистр – ES. Это осуществляется командами push DS и pop ES. Теперь ES=DS, а стек пуст. Данный прием широко используется для перенесения содержимого одного регистра в другой, особенно, если второй регистр сегментный.

     Следует обратить внимание на то, что после  выгрузки сохраненных в стеке данных они физически не стерлись, а остались в области стека на своих местах. Правда, при "стандартной" работе со стеком они оказываются недоступными. Действительно, поскольку указатель стека SP указывает под дно стека, стек считается пустым; очередная команда push поместит новое данное на место сохраненного ранее содержимого АХ, затерев его. Однако пока стек физически не затерт, сохраненными и уже выбранными из него данными можно пользоваться, если помнить, в каком порядке они расположены в стеке. Этот прием часто используется при работе с подпрограммами.

     Какого  размера должен быть стек? Это зависит  от того, насколько интенсивно он используется в программе. Если, например, планируется хранить в стеке массив объемом 10 000 байт, то стек должен быть не меньше этого размера. При этом надо иметь в виду, что в ряде случаев стек автоматически используется системой, в частности, при выполнении команды прерывания int 21h. По этой команде сначала процессор помещает в стек адрес возврата, а затем операционная система отправляет туда же содержимое регистров и другую информацию, относящуюся к прерванной программе. Поэтому, даже если программа совсем не использует стек, он все же должен присутствовать в программе и иметь размер не менее нескольких десятков слов. В нашем первом примере мы отвели под стек 128 слов, что безусловно достаточно. 

 

      1.5 Система прерываний

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

Информация о работе Язык Ассемблер