
- •Федеральное государственное бюджетное
- •1 Используемое оборудование и программное обеспечение 5
- •2 Общая подготовка к выполнению практических заданий 5
- •3 Общий ход выполнения практических заданий 6
- •4 Основные теоретические положения по программированию устройств персональных компьютеров на языке ассемблера 6
- •5 Процесс ассемблирования и выполнения программы 43
- •Введение
- •1 Используемое оборудование и программное обеспечение
- •2 Общая подготовка к выполнению практических заданий
- •3 Общий ход выполнения практических заданий
- •4 Основные теоретические положения по программированию устройств персональных компьютеров на языке ассемблера
- •4.1 Прерывания и механизм их обработки
- •4.2 Организация работы с файлами
- •4.2.1 Управление дисками и каталогами
- •1) Установка/ проверка дискового накопителя по умолчанию.
- •2) Определение доступного дискового пространства.
- •3) Создание/ удаление подкаталога.
- •4) Получение/ изменение текущего каталога.
- •4.2.2 Подготовка файлов к операциям чтения/ записи
- •1) Создание/ удаление файла.
- •2) Открытие/ закрытие файла.
- •3) Получение/ изменение атрибутов файла.
- •4) Переименование файла.
- •4.2.3 Чтение, запись, позиционирование в файле
- •4.2.3 Организация поиска файлов
- •4.3 Управление клавиатурой
- •4.4 Управление выводом информации на дисплей
- •4.4.1 Вывод символов на экран в текстовом режиме
- •4.4.2 Управление курсором
- •4.4.3 Вывод точечной графики
- •4.5 Управление таймером
- •4.5.1 Работа со счётчиком времени суток
- •4.5.2 Генерация звука
- •4.6 Управление прерываниями. Написание собственного прерывания.
- •4.7 Управление «мышью»
- •5 Процесс ассемблирования и выполнения программы
- •5.1 Получение исполняемого модуля
- •5.2 Работа с отладчиком программ turbo debugger
- •1 2 3 5 4
- •6 Программа на языке ассемблера
- •6.1 Структура программы
- •6.2 Примеры программ
- •7 Практическое занятие № 1. Управление дисплеем. Вывод символов ascii на экран
- •7.1 Цель практического занятия
- •7.2 Контрольные вопросы
- •10 Практическое занятие № 4. Управление клавиатурой. Ввод строки символов
- •14 Практическое занятие № 8. Управление мышью
- •14.1 Цель практического занятия
- •14.2 Контрольные вопросы
- •14.3 Практическое задание
- •15 Практическое занятие № 9. Управление прерываниями. Написание собственного прерывания
- •Приложение а
4.5.2 Генерация звука
Согласно /3-5/, канал 2 микросхемы таймера прямо связан с динамиком компьютера. Когда этот канал программируется в режиме 3, он посылает прямоугольные волны данной частоты. Из-за простоты динамика он сглаживает края прямоугольной волны, получая синусоидальную волну, более приятную для слуха. Микросхема таймера не позволяет менять амплитуду волну, поэтому нельзя менять громкость звука, издаваемого динамиком. Кроме того, сигнал также посылает микросхема связи с периферией. Комбинируя воздействия этих двух источников, можно получать различные звуковые эффекты.
Если процессор непосредственно управляет динамиком, то для генерации звука аппаратные прерывания должны быть отключены оператором CLI перед началом работы со звуком и включены оператором STI после окончания работы со звуком. Изменяя частоту (в диапазоне от 37 Гц до 32767 Гц) и длительность (в диапазоне от 0 до 65535 импульсов счётчика времени суток, или используя пустой цикл), можно получать различные звуки. Частоты нот первой октавы приведены в таблице 4.8.
Таблица 4.8 – Частоты нот первой октавы
Нота |
Частота |
До |
523,3 |
Ре |
587,3 |
Ми |
659,3 |
Фа |
698,5 |
Соль |
784,0 |
Ля |
880,0 |
Си |
987,7 |
Частоты на октаву выше можно получить, удваивая эти значения, частоты на октаву ниже приблизительно равны половине указанных в таблице 4.8 значений.
Генерация звука состоит во включении и выключении с желаемой частотой первого бита порта 61h микросхемы интерфейса с периферией, который связан с динамиком.
Для генерации звука определённой частоты необходимо в порт 42h (канал 2 микросхемы таймера) переслать желаемую частоту. Поскольку в порт можно за раз записать не более 1 байта, то пересылка частоты выполняется в два этапа (сначала посылается младший байт частоты, а потом старший). Затем в режиме запрещения аппаратных прерываний (команда CLI) необходимо отключить динамик от таймера, сбросив в 0 нулевой бит порта 61h. Потом подключить динамик к таймеру и включить звук, установив в единицу нулевой и первый биты порта 61h. По истечении требуемой длительности следует отключить звук, следует отключить звук, сбросив в 0 нулевой и первый биты порта 61h. После работы со звуком необходимо включить режим разрешения аппаратных прерываний командой STI.
Следует отметить, что при отключении аппаратных прерываний счётчик времени суток BIOS работать не будет. Поэтому для задания длительности целесообразно использовать пустой цикл.
4.6 Управление прерываниями. Написание собственного прерывания.
В некоторых случаях бывает полезным написание собственного прерывания. Например, многие программы конкретного пользователя могут использовать процедуру, выводящую строки на экран вертикально. Вместо того чтобы включать её в каждую программу в качестве процедуры, можно установить её как прерывание, написав соответствующую процедуру. /5/.
Краткое описание прерываний таблицы векторов прерываний представлено в таблице Г.1 приложения Г настоящих методических указаний (IRQ0 - IRQ15 - это аппаратные прерывания). Как следует из таблицы Г.1, векторы прерываний в диапазоне 60H-67H отведены для пользовательских прерываний.
Функция 25h (пересылается в AH) прерывания 21h устанавливает вектор прерывания на указанный адрес. Адреса имеют размер в два слова. Старшее слово содержит адрес сегмента (CS), младшее - смещение (IP). Чтобы установить вектор, указывающий на одну из процедур пользователя, нужно поместить начальный адрес процедуры в регистр DS (через регистр AX), а смещение – в регистр DX. Номер прерывания, за которым будет закреплена указанная процедура (например, 60h) помещается в регистр AL.Любая процедура прерывания должна завершаться инструкцией IRET, которая выталкивает из стека 3 слова: адрес возврата и регистр флагов. Следует отметить, что функция 25h автоматически запрещает аппаратные прерывания, поэтому не существует опасности, что в процессе перехода к процедуре произойдёт аппаратное прерывание, использующее данный вектор.
Когда программа завершается, должны быть восстановлены оригинальные векторы прерываний. В противном случае последующая программа может вызвать данное прерывание и передать управление на то место памяти, в котором пользовательской процедуры уже нет. Функция 35h (пересылается в AH) прерывания 21h возвращает текущее значение вектора прерывания, помещая адрес сегмента в регистр ES, а смещение – в регистр BX. Перед установкой собственного прерывания рекомендуется получить текущее значение вектора, сохранить эти значения и затем восстановить их с помощью функции 25h (как сказано выше) перед завершением своей программы
Существуют «ловушки», которых следует избегать при написании собственных прерываний /3-5/. Например, если программа завершается по нажатию «Ctrl+Break», то вектор прерывания не будет восстановлен, если пользователем не предусмотрено противное.