Ассемблер. Учебное пособие
..pdfСОДЕРЖАНИЕ |
|
Предисловие ………………………………………………... |
4 |
Введение ……………………………………………………. |
5 |
1. Система прерываний ПК. Написание собственных |
|
процедур прерываний. Макроопределения …………….… |
6 |
2. Внешняя память…………………………………………….. |
14 |
2.1.Общие сведения………………………………………… |
14 |
2.2.Архитектура дисковой подсистемы …………………. |
15 |
2.3.Программа дискового начального загрузчика ………. |
17 |
2.4.Работа BIOS с НМД ……………………………………. |
20 |
2.5.Внешняя память на гибком магнитном диске ……….. |
22 |
2.6.Пример защиты программы с помощью ключевой |
|
дискеты ……………………………………………………... |
30 |
3. Служба времени ……………………………………………. |
34 |
3.1.Счетчик системного времени …………………………. |
34 |
3.2.Часы реального времени (РТС) ……………………….. |
39 |
3.3.Задержка программных операций ……………………. |
41 |
3.4.Управление работой в фоновом режиме …………….. |
42 |
3.5.Генерация звука ………………………………………... |
44 |
4. Ввод информации с клавиатуры ПК ……………………… |
48 |
5. Вывод информации на дисплей ПК ………………………. |
55 |
5.1.Общие сведения ………………………………………... |
55 |
5.2.Динамика изображений ……………………………….. |
65 |
5.3.Библиотека макроопределений ……………………….. |
67 |
Список литературы ………………………………………… |
69 |
3
Предисловие
Робототехника вносит ощутимые изменения в нашу повседневную жизнь: современные предприятия и технологические процессы ориентируются в основном на безлюдные технологии, растет спектр «специальностей» умных машин, бытовая техника становится более функциональной, не требуя при этом от пользователя высшего образования и т.д. Это становится возможным благодаря использованию микропроцессорной техники, которая даже на данном уровне развития отличается высокой надежностью, большим спектром областей использования и низкой стоимостью.
Всвязи с этим, от современного специалиста требуются отличные знания в области не только использования готовых микропроцессорных систем управления, но и в области разработки новых конструктивных решений, создания специализированных программных средств как высокого, так и низкого уровней. Большое количество издаваемой литературы по микропроцессорной технике и персональным компьютерам ориентировано или на узкую специализацию, или на «чайников», вопросы использования микропроцессоров для управления техническими объектами практически не рассматриваются.
Всвязи с этим авторы попытались восполнить этот недостаток, написав данное пособие. Структура и содержание пособия сложились
входе многолетнего преподавания авторами учебных дисциплин по основам работы с микропроцессорами на кафедре Технической кибернетики.
4
ВВЕДЕНИЕ
Важнейшей тенденцией развития современной экономики является широкое использование автоматизированных и автоматических производств, построенных на базе промышленных роботов, станков с ЧПУ (числовым программным управлением), автоматических линий и т.д. При подготовке специалистов в области создания таких систем и дальнейшей их эксплуатации, для качественного усвоения материалов по таким курсам, как «Микропроцессорные устройства управления», «ПО микропроцессорных устройств управления», «Управление роботами и РТС» и «Архитектура микроЭВМ» необходимо свободное владение различными способами работы с микропроцессорами и персональными компьютерами.
Отсутствие современных литературных источников, в которых бы с единой позиции рассматривались наиболее часто реализуемые в системах управления роботами и техническими системами способы использования ресурсов микропроцессоров и ПК, обусловило необходимость написания настоящего учебного пособия. Каждый из разделов посвящен отдельному модулю, входящему в состав наиболее распространенных систем управления, раскрываются содержание основных режимов работы, способы и методы управления.
Библиотека макроопределений, приведенная в учебном пособии, позволит студентам специальностей 210300 «Роботы и робототехнические системы» и 210100 «Управление и информатика в технических системах» более быстро и качественно выполнять задания лабораторных работ по соответствующим курсам, а также сократить время, затрачиваемое на выполнение курсовых работ.
Работа содержит массу практических примеров, которые были написаны авторами и использованы при создании реальных систем управления на базе микропроцессорной техники.
5
1. Система прерываний ПК. Написание собственных процедур прерываний. Макроопределения
Как показывает практика для эффективной работы с системными ресурсами персонального компьютера, а тем более с ресурсами микроЭВМ или микропроцессорных систем, необходимо использовать систему прерываний BIOS или MS-DOS. Базовая система ввода-вывода BIOS (Вasic Input/Output System) реализует следующие функции:
•обмен данными между различными устройствами ПК;
•ввод информации с клавиатуры;
•вывод информации на монитор;
•дисковое устройство начальной загрузки и т.д.
Таким образом, без BIOS компьютер представляет собой лишь набор микросхем и различных деталей. Интерес, с точки зрения управления ресурсами, представляет собой система прерываний, позволяющая писать компактные, быстрые программы обслуживания стандартных и нестандартных периферийных устройств ПК. Кроме прерываний BIOS в состав операционной системы также входят собственные прерывания ОС (операционной системы) которые позволяют реализовывать более сложные действия. Все прерывания компьютера делятся на аппаратные и программные.
Аппаратные прерывания инициируются аппаратурой, при этом процессор прекращает все вычисления для выполнения вызванного прерывания. Некоторые из этих прерываний относятся к немаскируемым прерываниям, т.е. их обработку нельзя прервать. Обработку остальных аппаратных прерываний и обработку программных прерываний можно запретить, сбросив флаг IF при помощи команды CLI. При более детальном рассмотрении обработки прерываний, программные скорее можно отнести к процедурам, которые вызываются для выполнения каких-то стандартных действий и выполнение программы не прерывают. Но в то же самое время эти процедуры находятся не в вызывающей программе, а в операционной системе, и только механизм прерываний дает вам возможность обращения к ним. Программные прерывания могут вызываться друг из друга и вызывать аппаратные прерывания, а ограничения на вложенность таких процедур связаны лишь с размерами программного стека. Такая вложенность процедур не вызывает
6
конфликтов, потому что каждая подпрограмма обработки прерывания сохраняет значения всех используемых регистров в стеке, а затем восстанавливает их при выходе.
Прерывания представляют собой мощные компактные процедуры в памяти ПК, доступ к которым организуется подобно вызову процедур. Но при этом прерывание всегда вызывает косвенный переход к своей программе обработки за счет получения её адреса из вектора прерывания. Еще одним отличием от вызова процедуры является сохранение в стеке не только адреса, но еще и содержимого регистра флагов.
Вектор прерываний представляет собой 32-разрядную ячейку памяти, в первом слове которой хранится значение указателя команд IP, а во втором – сегмента команд CS. Под вектора прерываний выделены младшие 1024 байта памяти компьютера, таким образом, число доступных в системе прерываний равно 256. Данная область памяти имеет собственное название – таблица прерываний, расположение в ОЗУ (оперативное запоминающее устройство) компьютера. Содержимое таблицы прерываний показано на рис. 1.1.
Прерывания могут быть вызваны из программы с использованием команды INT, которая имеет формат:
INT номер_прерывания,
где номер_прерывания – номер, идентифицирующий один из 256 различных векторов, находящихся в памяти.
Следует более подробно остановиться на работе процессора при вызове процедуры прерывания.
При исполнении команды INT процессор производит следующие действия:
1.помещает в стек регистр флагов;
2.обнуляет флаг трассировки TF и флаг прерываний IF для исключения пошагового режима исполнения команд и блокировки других маскируемых прерываний;
3.помещает в стек значение регистра CS;
4.вычисляет адрес вектора прерывания, умножая номер_прерывания на 4;
5.загружает второе слово вектора прерывания в регистр CS;
6.помещает в стек значение указателя команд IP;
7.загружает в указатель команд IP первое слово вектора прерывания.
7
0F400 H
0ВС00 H
0В800 H
0В100 H
0В000 H
0А000 H
Изменяется
0400 H
0000 H
Системное ПЗУ, автономный
BASIC, ПЗУ BIOS
Зарезервировано
Буфер регенерации 16К для работы с CGA,EGA,VGA в текстовом и графическом режимах
Зарезервировано
Буфер регенерации 4К для монохромного адаптера
Область буфера регенерации для
работы с адаптерами ЕGA, VGA в режиме 350х480 (графика)
Транзитная часть
COMMAND.COM
Область транзитной программы
Система MS-DOS, ее буферы, таблицы и драйверы устройств
Вектора прерываний
Вектора прерываний
BASIC (80H-FFH)
Вектора прерываний
пользователя (60H-7FH)
Зарезервированные вектора прерываний
(40H-5FH)
Вектора прерываний
DOS (20H-3FH)
Вектора прерываний
BIOS (0H1FH)
Рис. 1.1. Распределение памяти IBM PC и содержимое таблицы прерываний
Такую же роль, как команда RET для процедур, для прерываний выполняет команда IRET. Она заставляет процессор выполнить переход из процедуры обработки прерывания к вызывающей программе, извлекая из стека три слова и загружая их в указатель команд IP, регистр сегмента CS и регистр флагов соответственно. Содержимое других регистров может быть уничтожено, если в процедуре не было предусмотрено их сохранение.
Программисту также предоставляется возможность написать свое собственное прерывание. Это можно сделать, используя функцию 25H прерывания 21H, которая устанавливает вектор прерывания на указанный адрес. Адрес должен иметь размер в 4
8
слова, старшее из которых содержит значение сегмента CS, а младшее – IP. Чтобы установить вектор, указывающий на вновь созданную процедуру обработки, необходимо поместить сегмент процедуры в DS, а смещение в DX, номер прерывания записать в AL и вызвать описанную выше функцию. При этом ваша процедура должна заканчиваться оператором IRET. При завершении работы программы следует восстановить оригинальный вектор прерывания, иначе создастся ситуация, когда другая программа вызовет данное прерывание и передаст управление на то место, в котором вашей процедуры уже нет. Это действие выполняется с использованием функции 35Н прерывания 21Н, которая возвращает текущее значение вектора прерывания, помещая значение сегмента в ES, а смещение в
BX.
Таким образом, перед установкой своего прерывания следует получить текущее значение вектора прерывания, сохранить его, а затем перед завершением программы восстановить вектор, используя функцию 25H прерывания 21H. Пример оформления программы и процедуры обработки прерывания приведены ниже:
******сегмент данных********
save_CS DW 0 save_IP DW 0
*******начало программы*********
mov AH, 35h ; функция получения вектора mov AL, 60h ; номер вектора
int 21h
mov save_IP, bx ; сохраняем смещение mov sav_CS, es ; сохраняем сегмент push ds
mov dx, offset ROUT mov ax, seg ROUT mov ds, ax
mov ah, 25h mov al, 60h int 21h pop ds
******* конец программы *********
cli push ds
9
mov dx, save_IP mov ax, save_CS mov ds, ax
mov ah, 25h mov al, 60h int 21h pop ds
sti
***********
*******процедура прерывания*******
ROUT |
proc far |
|
|
push ax |
|
|
тело процедуры |
|
|
pop |
ax |
|
mov |
al, 20h |
|
out |
20h, al |
|
iret |
|
ROUT |
endp |
|
Последние две строчки процедуры обработки прерывания необходимы, чтобы затем была разрешена обработка прерываний с более низкими уровнями приоритета.
Написание собственной процедуры прерывания требует высокой квалификации программиста, поэтому чаще для выполнения типовых операций используют макроопределения. Макроопределения, как и процедуры, представляют собой последовательность операторов на языке ассемблера, которые затем в основной программе могут встречаться неоднократно. Каждое макроопределение имеет собственное уникальное имя, которое затем, при компиляции, заменяется на тело макроопределения. По сравнению с процедурами макроопределения имеют три преимущества:
они более динамичны. Изменение входных параметров меняет не только объекты, над которыми производятся манипуляции, но и сами действия;
применение макроопределений позволяет ускорить выполнение программ, так как нет необходимости выполнять операции передачи управления в процедуру и возврата из нее;
из макроопределений можно создать библиотеку, которую легко использовать при написании других программ.
10
Единственный недостаток при использовании макроопределений состоит в том, что размер программы может существенно увеличиться.
Каждое макроопределение имеет три части:
1.заголовок – псевдооператор MACRO, в поле метки которого указано имя макроопределения, а в поле операнда – необязательный список формальных параметров;
2.тело – последовательность операторов ассемблера, которые задают действия, выполняемые макроопределением;
3.окончание – псевдооператор ENDM, который отмечает конец макроопределения.
При использовании макроопределений в качестве операндов
могут быть использованы регистры, ячейки памяти или непосредственные значения, что значительно облегчает передачу параметров, в отличие от процедур, где параметры должны быть занесены в регистры или ячейки памяти перед вызовом процедуры.
Более гибкой работа макроопределений становится благодаря использованию псевдооператоров. Особенно часто используются следующие псевдооператоры:
•LOCAL – позволяет использовать в макроопределении метки,
ипри каждом расширении макроопределения компилятор генерирует уникальные имена меток;
•IRP – позволяет перечислить аргументы, которые должны быть подставлены вместо формального параметра при каждом повторении;
•REPT – позволяет получить число повторений из выражения, указанного в поле операнда, при этом повторяющаяся часть макроопределения должна заканчиваться псевдооператором
ENDM;
•IF1 – используется для считывания файла с библиотекой макроопределений в исходную программу при первом проходе;
•IFB – позволяет указать альтернативные способы обработки незаданных при вызове макроопределения параметров;
•;; – операция заставляющая опустить комментарии при расширении макроопределений, что сокращает объем программы.
Макроопределения в тексте программы задаются в самом начале
или считываются из файла – библиотеки макроопределений.
11
Библиотека макроопределений представляет из себя файл с набранными в нем макроопределениями, при этом возможно использование при написании макроопределения ранее созданное, если оно выполняет необходимые действия. Если файл с макроопределениями имеет имя MACROS1.LIB, то подключение его к исходной программе осуществляется следующим образом:
IF1
INCLUDE MACROS1.LIB ENDIF
Таким образом, файл с библиотекой будет подключен во время первого прохода, при этом не лишним будет удалить лишние макроопределения, содержащиеся в библиотеке и не используемые в программе. Это осуществляется простым перечислением имен удаляемых макроопределений вслед за оператором INCLUDE:
INCLUDE MACROS1.LIB
PURGE MACR1, MACR2, MACR11
С помощью макроопределений можно упростить понимание программы и некоторые рутинные операции. Например, часто в программах, написанных на языке Ассемблер, требуется сохранить в стеке содержимое регистров: при вызове процедур и т.д. Макроопределения, которые сохраняют содержимое регистров в стеке и извлекают данные из стека, позволяют сделать эти операции намного понятней, что приводит также к уменьшению ошибок.
push_reg MACRO reg_list IPR reg, <reg_list> push reg
ENDM
ENDM
pop_reg MACRO reg_list IPR reg, <reg_list> pop reg
ENDM
ENDM
Затем в программе вместо последовательности операторов push можно будет записать имя макроопределения с перечислением обозначений требуемых регистров:
push_reg <ax, bx, cx, dx>
12