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

Автор: Пользователь скрыл имя, 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 Кб (Скачать)

 

Рисунок 2 - Аппаратная организация прерываний. 

     Два контроллера используются для увеличения допустимого количества внешних  устройств. Дело в том, что каждый контроллер прерываний может обслуживать сигналы лишь от 8 устройств. Для обслуживания большего количества устройств контроллеры можно объединять, образуя из них веерообразную структуру. В современных машинах устанавливают два контроллера, увеличивая тем самым возможное число входных устройств до 15 (7 у ведущего и 8 у ведомого контроллеров).

     К входным выводам IRQ1...IRQ7 и IRQ8...IRQ15 (IRQ - это сокращение от Interrupt Request, запрос прерывания) подключаются выводы устройств, на которых возникают сигналы прерываний. Выход ведущего контроллера подключается к входу INT микропроцессора, а выход ведомого - к входу IRQ2 ведущего. Основная функция контроллеров - передача сигналов запросов прерываний от внешних устройств на единственный вход прерываний микропроцессора. При этом, кроме сигнала INT, контроллеры передают в микропроцессор по линиям данных номер вектора, который образуется в контроллере путем сложения базового номера, записанного в одном из его регистров, с номером входной линии, по которой поступил запрос прерывания. Номера базовых векторов заносятся в контроллеры автоматически в процессе начальной загрузки компьютера. Для ведущего контроллера базовый вектор всегда равен 8, для ведомого - 70h. Таким образом, номера векторов, закрепленных за аппаратными прерываниями, лежат в диапазонах 8h...Fh и 70h...77h. Очевидно, что номера векторов аппаратных прерываний однозначно связаны с номерами линий, или уровнями IRQ, а через них - с конкретными устройствами компьютера. На рисунке 3 указаны некоторые из стандартных устройств компьютера, работающих в режиме прерываний.

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

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

 

     Рисунок 3 - Процедура обслуживания прерывания. 

     Самое начало оперативной памяти от адреса 0000h до 03FFh отводится под векторы прерываний - четырехбайтовые области, в которых хранятся адреса обработчиков прерываний (ОбрПр на рисунке 3). В два старшие байта каждого вектора записывается сегментный адрес обработчика, в два младшие - смещение (относительный адрес) точки входа в обработчик. Векторы, как и соответствующие им прерывания, имеют номера, причем вектор с номером 0 располагается, начиная с адреса 0, вектор 1 - с адреса 4, вектор 2 - с адреса 8 и т.д. Вектор с номером п занимает, таким образом, байты памяти от n*4 до n*4+3. Всего в выделенной под векторы области памяти помещается 256 векторов.

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

     Обработчик  прерываний всегда заканчивается командой iret (interrupt return, возврат из прерывания), выполняющей обратные действия - извлечение из стека сохраненных там слов и помещение их назад в регистры IP и CS, а также в регистр флагов. Это приводит к возврату в

основную программу в ту самую точку, где она была прервана.

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

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

     Наконец, еще одним чрезвычайно важным типом прерываний являются программные  прерывания. Они вызываются командой hit с числовым аргументом, который рассматривается процессором, как номер вектора прерывания. Если в программе встречается, например, команда int 13h, то процессор выполняет ту же процедуру прерывания, используя в качестве номера вектора операнд команды int. Программные прерывания применяются в первую очередь для вызова системных обслуживающих программ - функций DOS и BIOS.

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

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

00h - внутреннее прерывание, деление на 0; 
0lh - внутреннее прерывание, пошаговое выполнение (при TF=1); 
02h - немаскируемое прерывание (вывод NMI процессора); 
08h - аппаратное прерывание от системного таймера; 
09h - аппаратное прерывание от клавиатуры; 
0Eh - аппаратное прерывание от гибкого диска; 
10h - программное прерывание, программы BIOS управления видеосистемой; 
13h - программное прерывание, программы BIOS управления дисками; 
16h - программное прерывание, программы BIOS управления клавиатурой; 
IDh - не вектор, адрес таблицы видеопараметров, используемой BIOS; 
lEh - не вектор, адрес таблицы параметров дискеты, используемой BIOS; 
21h - программное прерывание, диспетчер функций DOS; 
22h - программное прерывание, адрес перехода при завершении процесса, используемый DOS; 
23h - программное прерывание, обработчик прерываний по <Ctrl>/C, используемый DOS; 
25h - программное прерывание, абсолютное чтение диска (функция DOS); 
26h - программное прерывание, абсолютная запись на диск (функция DOS); 
60h...66h - зарезервировано для программных прерываний пользователя; 
68h...6Fh - программные прерывания, свободные векторы; 
70h - аппаратное прерывание от часов реального времени (с питанием от аккумулятора); 
76h - аппаратное прерывание от жесткого диска.

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

     1) векторы внутренних прерываний  процессора (0lh, 02h и др.);

     2) векторы аппаратных прерываний (08h...0Fh и 70h...77h);

     3) программы BIOS обслуживания аппаратуры компьютера (10h, 13h, 16h и др.);

     4) программы DOS (21h, 22h, 23h и др.);

     5) адреса системных таблиц BIOS (IDh, lEh и др.).

     Системные программы, адреса которых хранятся в векторах прерываний, в большинстве своем являются всего лишь диспетчерами, открывающими доступ к большим группам программ, реализующих системные функции. Так, видеодрайвер BIOS (вектор 10h) включает программы смены видеорежима, управления курсором, задания цветовой палитры, загрузки шрифтов и многие другие. Особенно характерен в этом отношении вектор 21h, через который осуществляется вызов практически всех функций DOS: ввода с клавиатуры и вывода на экран, обслуживания файлов, каталогов и дисков, управления памятью и процессами, службы времени и т.д. Для вызова требуемой функции надо не только выполнить команду int с соответствующим номером, но и указать системе в одном из регистров (для этой цели всегда используется регистр АН) номер вызываемой функции. Иногда для "многофункциональных" функций приходится указывать еще и номер подфункции (в регистре AL).  

 

      1.6 Макрокоманды

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

     Макроопределение  должно начинаться строкой с именем макроопределения и директивой macro, в поле аргументов которой указывается список формальных аргументов. Заканчивается макроопределение директивой endm.

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

     psh macroa,b,c

     push a

     push b

     push с 

     endm

     Появление в исходном тексте программы строки psh АХ, ВХ, СХ приведет к генерации следующего фрагмента текста: push AX push BX push CX. Если же в исходном тексте имеется строка psh DX, ES, ВР, то соответствующее макрорасширение будет иметь вид:

     push DX

     push ES

     push BP

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

     psh mem, [BX], ES: [17h] приведет к следующему макрорасширению:

     push mem

     push [BX]

     push ES : [17h] 

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

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

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

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

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

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

     Макробиблиотека представляет собой файл с текстами макроопределений. Макроопределения записываются в этот файл точно в таком же виде, как и в текст программы. Для того чтобы транслятору были доступны макрокоманды из файла макробиблиотеки, его следует на этапе трансляции подсоединить к исходному тексту программы директивой ассемблера include (include my macro, mac). Все макрокоманды, включенные в файл макробиблиотеки, можно использовать в любом месте программы. 

 

      1.7 Этапы разработки программы

     Язык программирования наиболее полно учитывающий особенности "родного" микропроцессора и содержащий мнемонические обозначения машинных команд называется Ассемблером. Программа, написанная на Ассемблере называется исходной программой. Для создания исходных программ можно пользоваться различными трансляторами, поддерживающими возможность разработки программ на языке ассемблера. В своей курсовой работе я остановилась на трансляторе, называемом Microsoft Macro Assembler (MASM).

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