<<
>>

Ввод из порта и вывод в порт

В главе 5 при обсуждении вопроса о том, где могут находиться операнды машин- ной команды, мы упоминали порт ввода-вывода. Физически порт ввода-вывода представляет регистр разрядностью 8, 16 или 32 бита.
Доступ к устройствам вво- да-вывода, системным устройствам компьютера осуществляется посредством этих регистров, причем каждый из этих регистров должен иметь возможность уникаль- ной идентификации. С этой целью архитектурно процессор поддерживает так называемое адресное пространство ввода-вывода. Адресное пространство ввода- вывода физически независимо от пространства оперативной памяти и имеет огра- ниченный объем, составляющий 216, или 65 536, адресов ввода-вывода. Таким образом, порт ввода-вывода можно определить как 8-, 16- или 32-раз- рядный аппаратный регистр, имеющий определенный адрес в адресном простран- стве ввода-вывода. Вся работа системы с устройствами на самом низком уровне выполняется с использованием портов ввода-вывода. Посмотрите на рис. 7.1. На нем показана сильно упрощенная концептуальная схема управления оборудова- нием компьютера.
Рис. 7.1. Концептуальная схема управления оборудованием компьютера

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

То есть, фактически, нужно знать, что и в какой последовательности нужно послать в порт (при записи в него) или считать из него (при чтении) и как следует трактовать эту информа- цию. Для этого достаточно всего двух команд, присутствующих в системе команд процессора: ш in , — ввод в аккумулятор из порта с номером ; * out , — вывод содержимого аккумулятора в порт с номером . Возможные значения операндов этих команд приведены в приложении. Необ- ходимо отметить, что использовать эти команды вы сможете без проблем только в программе, предназначенной для MS-DOS. При попытке их запуска в програм- ме для Windows вы получите ошибку. Это не означает невозможности запуска ис- полняемого модуля описанной далее программы в сеансе Windows. Более того, Windows поддержит реализацию полного цикла разработки данной программы, но сделано это будет в специальном режиме работы — режиме виртуального про- цессора х86. В качестве примера рассмотрим, как на уровне аппаратуры заставить компью- тер издавать звуки через свой внутренний динамик. На большинстве компьюте- ров читателей это будет некоторый треск. Изменяя различные параметры програм- мы, в идеале, вы можете получить звук, напоминающий сирену. Вначале мы перечислим, какие аппаратные ресурсы будут задействованы и как ими надо управлять. В большинстве компьютеров есть внутренний динамик. Раньше он использо- вался для того, чтобы издавать звуки при работе самых различный приложений, вплоть до игровых. Сейчас у него осталась единственная важная функция — вос- произведение звуков, которые генерирует BIOS на этапе тестирования и началь- ной загрузки. ПРИМЕЧАНИЕ Несмотря на то что прямой доступ к портам ввода-вывода доступен только из среды MS-DOS, сведения о номерах портов и особенностях работы с ними полезны и при программировании для Windows. Если системы Windows 95/98 практически не закрывают доступ к портам, то в Windows NT/2000/XP любая попытка обращения к ним приведет к возникновению ошибки. Причина в том, что порты являются крити- чески важным ресурсом, и механизмы защиты Windows NT/2000/XP не могут допустить их монополизацию каким-либо приложением.
Опе- рационная система Windows NT/2000/XP предоставляет программи- сту функции API для работы с устройствами, посредством которых в конечном итоге и осуществляется доступ к портам посредством ко- манд IN и OUT. Попытка использовать эти команды в программе пользователя в среде Windows NT/2000/XP приведет к возникнове- нию исключения по недопустимому коду операции. Важно понимать, что на низком уровне управление аппаратурой компьютера ведется с использованием тех же портов, что и при работе в MS-DOS, то есть физика остается, меняется логика управления аппаратурой. Если про- грамме удастся получить уровень привилегий ядра (такой уровень имеют драйверы устройств), то в этом случае она может беспрепят- ственно использовать команды IN и OUT и работать с устройством так же, как в среде MS-DOS. Существуют специальные программы, которые позволяют получить доступ к портам ввода/вывода из про- граммы пользователя, исключая необходимость написания драйвера. Среди файлов, прилагаемых к книге, содержатся две наиболее извест- ные из таких программ — UserPort и PortTalk1. Как это ни удивительно, но специальной схемы генерации звука для внутрен- него динамика нет. Сигнал для управления динамиком формируется в результате совместной работы следующих микросхем: программируемого периферийного интерфейса (ППИ) i8255; таймера i825З. Общая схема формирования такого сигнала показана на рис. 7.2. Обсудим представленную схему. Основная работа по генерации звука произ- водится микросхемой таймера. Микросхема таймера (далее просто таймер) имеет три канала с совершенно одинаковыми внутренней структурой и принципом ра- боты. На каналы таймера подаются импульсы от микросхемы системных часов, которые, по сути, представляют собой генератор импульсов, работающий с часто- той 1,19 МГц. Каждый канал имеет два входа и один выход. Выходы канала зам- кнуты на вполне определенные устройства компьютера. Так, канал 0 замкнут на [5]
Рис.
7.2. Схема формирования звука для встроенного динамика

контроллер прерываний, являясь источником аппаратного прерывания от тайме- ра, которое возникает 18,2 раза в секунду. Канал 1 связан с микросхемой прямого доступа к памяти (DMA). И наконец, канал 2 выходит на динамик компьютера. Как мы отметили, каналы таймера имеют одинаковую структуру, основу которой составляют три регистра: рег истр ввода-вывода разрядностью 8 бито в, регистр-фик- сатор (latch register) прегистр-счетчик (counter register), оба по 16 битов. Все ре- гистры связаны между собой следующим образом. В регистр ввода-вывода извне помещается некоторое значение. Источником этого значения может быть либо системное программное обеспечение, либо программа пользователя. Каждый ре- гистр ввода-вывода имеет адрес в адресном пространстве ввода-вывода (номер порта ввода-вывода). Регистр ввода-вывода канала 2 имеет номер порта ввода- вывода 42h. Помещаемые в него значения немедленно попадают в регистр-фикса- тор, где значение сохраняется до тех пор, пока в регистр ввода-вывода не будет записано новое значение. Но как согласуются эти регистры по их разрядности, ведь один из них 8-, а другой 16-разрядный? Для этого предназначен регистр управле- ния (ему соответствует порт 43h), который является частью механизма управле- ния всей микросхемой таймера. Он содержит слово состояния, с помощью которо- го производятся выбор канала, задание режима работы канала и типа операции передачи значения в канал. Далее описана структура слова состояния: ш Бит 0 определяет тип константы пересчета: 0 — константа задана двоичным числом, 1 — константа задана двоично-десятичным (BCD) числом. Константа пересчета — значение, загружаемое извне в регистр-фиксатор; в нашем случае загружаться будет двоичное число, поэтому значение этого поля будет равно 0. ii Биты 1-3 определяют режим работы микросхемы таймера. Всего можно опре- делить шесть режимов, но обычно используется третий, поэтому для нашего случая значение поля — 011. т Биты 4-5 определяют тип операции: 00 — передать значение счетчика в регистр- фиксатор (то есть возможны не только операция записи значения в канал, но и извлечение значения регистра-счетчика из него), 10 — записать в регистр-фик- сатор только старший байт, 01 — записать в регистр-фиксатор только младший байт, 11 — записать в регистр-фиксатор сначала старший байт, затем младший. В нашем случае значение поля будет 11. Поэтому формирование 16-paзpяднoгo регистра-фиксатора через 8-разрядный регистр ввода-вывода производится следующим образом: запись производится в два приема, первый байт из регис- тра ввода-вывода записывается на место старшего байта регистра-фиксатора, второй байт — на место младшего байта. Нетрудно догадаться, что в регистр ввода-вывода эти байты помещаются командами IN и OUT. II Биты 6-7 определяют номер программируемого канала. В нашем случае они равны 10. . Для формирования любого звука необходимо задать его длительность и высо- ту. После того как значение из регистра ввода-вывода попало в регистр-фиксатор, оно моментально записывается в регистр-счетчик. Сразу же после этого значение регистра-счетчика начинает уменьшаться на единицу с приходом каждого импульса от системных часов. На выходе любого из трех каналов таймера стоит схема логи- ческого умножения. Эта схема имеет два входа и один выход. Значение регистра- счетчика участвует в формировании сигнала на одном из входов схемы логическо- го умножения И. Сигнал на втором входе этой схемы зависит от состояния бита О регистра микросхемы интерфейса с периферией (порт 61h). В свое время мы по- дробно разберемся с логическими операциями, сейчас следует лишь пояснить, что единица на выходе схемы логического умножения может появиться только в од- ном случае — когда на обоих входах единицы. Когда значение в регистре-счетчике становится равным нулю, на соответствующем входе схемы И формируется такая единица. И если при этом на втором входе, значение которого зависит от бита О порта 61h, также 1, то импульс от системных часов проходит на выход канала 2. Одновременно с пропуском импульса в канале 2 немедленно производится загрузка содержимого регистра-фиксатора (которое не изменилось, если его не изменили извне) в регистр-счетчик. Весь процесс с уменьшением содержимого регистра-счет- чика повторяется заново. Теперь вы понимаете, что чем меньшее значение загру- жено в регистр-фиксатор, тем чаще будет происходить обнуление регистра-счет- чика и тем чаще импульсы будут проходить на выход канала 2. А это означает большее значение высоты звука. Понятно, что максимальное значение частоты на входе 1 динамика — 1,19 МГц. Таким образом, импульс с выхода канала 2 попадает на динамик, и если на последний подан ток, то возникает долгожданный звук. По- дачей тока на динамик управляет бит 1 порта 61h. Как прервать звучание? Очевид- но, для этого возможны два пути: первый — отключить ток, сбросив бит 1 порта 61h, второй — сбросить бит 0 порта 61h. Эти две возможности используют для соз- дания различных звуковых эффектов. Сбрасывая и устанавливая эти биты, мы фактически определяем длительность звучания. Если вы внимательно следили за всеми рассуждениями, то, наверное, без труда сможете понять, почему первый канал таймера формирует сигналы аппаратного прерывания от таймера 18,2 раза в секунду (на основании этих сигналов програм- мы отслеживают время). Для этого BIOS во время загрузки после включения ком- пьютера загружает в первый канал соответствующее значение. Таким образом, наметились три последовательных действия, необходимые для программирования звукового канала таймера (они применимы и к остальным ка- налам). 1. Посредством порта 43 h выбрать канал, задать режим работы и тип операции передачи значения в канал. В нашем случае соответствующее значение будет равно 10110110 = Оb6h. 2. Подать ток на динамик, установив бит 1 порта 61h. 3. Используя регистр АХ, поместить нужное значение в порт 42h, определив тем самым нужную высоту тона. Далее в листинге 7.1, приведена программа, реализующая некоторые звуки. Многие команды вам уже знакомы, некоторые мы пока еще не рассматривали, по- этому поясним их функциональное назначение. Подробно они будут рассмотрены в последующих главах. Для удобства в программе была использована макроко- манда delay, выполняющая задержку работы программы на заданное время. По- дробнее механизм макроподстановок будет рассмотрен в главе 14. Сейчас только отметьте для себя, что введенная таким образом макрокоманда в тексте програм- мы синтаксически ничем не отличается от других команд ассемблера, и это позво- ляет программисту при необходимости расширить стандартный набор команд ас- семблера. Введите текст макрокоманды delay (строки 13-25) и воспринимайте ее чисто по функциональному назначению (задержка выполнения программы на про- межуток времени, задаваемый значением ее операнда). Стоит отметить, что дан- ная макрокоманда чувствительна к производительности процессора, из-за чего звуки на компьютерах с разными моделями процессоров могут не совпадать. Сег- мент кода, как обычно, начинается с настройки сегментного регистра DS (строки 32-33) на начало сегмента данных. После этого строками 37-38 мы выполняем действия первого этапа — настройку канала 2, которая заключается в записи в ре- гистр управления (порт 43h) байта состояния OB6h. На втором шаге мы должны установить биты 0 и 1 порта 61h. Предварительно необходимо извлечь содержи- мое этого порта. Это делается для того, чтобы выполнять установку битов 0 и 1, не изменяя содержимого остальных битов порта 61h (строки 39-41). Принцип фор- мирования сигнала сирены заключается в том, что в цикле на единицу изменяется содержимое регистра-счетчика и делается небольшая задержка для того, чтобы сигнал некоторое время звучал с нужной высотой. Постепенное повышение, а за- тем понижение высоты и дает нам эффект сирены. Строки 43-53 соответствуют циклу, в теле которого высота повышается, а строки 55-62 — циклу понижения тона. Оба цикла повторяются последовательно 5 раз. Контроль осуществляется с помощью переменной cnt, содержимое которой увеличивается на 1 в строке 69 и контролируется на равенство 5 в строках 71-72. Если cnt = 5, то команда СМР устанавливает определенные флаги. Последующая команда условного перехода ONE анализирует эти флаги и в зависимости от их состояния передает управление либо на метку, указанную в качестве операнда этой команды, либо на следующую за JNЕ команду. Цикл в программе ассемблера можно организовать несколькими способами; все они будут подробно рассмотрены в главах 10 и 11. В данном случае цикл организуется командой ШОР, которая в качестве операнда имеет имя метки. На эту метку и передается управление при выполнении команды ШОР. Но до того как передать управление, команда ШОР анализирует содержимое регистра ЕСХ/СХ, и если оно равно нулю, управление передается не на метку, а на следующую за LOOP команду. Если содержимое регистра ЕСХ/СХ не равно нулю, то оно уменьшает- ся на единицу и управление передается на метку. Таким образом в ЕСХ/СХ хранится счетчик цикла. В нашей программе он загружается в ЕСХ/СХ в строках 42 и 54.

Листинг7.1. Реализация сирены

Листинг 7.1 (продолжение) Среди файлов, прилагаемых к книге, в каталоге данной главы есть еще один пример использования команд ввода из порта и вывода в порт — это редактор CMOS-памяти. На данном этапе изучения ассемблера не стоит пытаться разоб- раться с ним, но впоследствии обязательно стоит к нему вернуться.

<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Ввод из порта и вывод в порт:

  1. § 75 Ввод во владение по завещанию и споры на завещание. – Различные способы спора. – Пошлины с перехода имений по завещанию.
  2. § 38 Изменение старых понятий о переходе вотчинного права. – Формы приобретения по нынешнему закону. – Ввод во владение по новому нотариальному уставу. – Невыгоды от неизвестности о правах. – Попытка к регистрации поземельной собственности в России. – Вотчинная записка в прибалтийских губерниях
  3. Выводы
  4. Выводы
  5. Выводы
  6. Выводы
  7. 7. Выводы, основанные на эмоциях
  8. 2.4.3. Выводы
  9. Выводы
  10. Выводы