Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Откроем новый дескриптор




Программные строки

PROCDAT

она будет ожидать ввода исходных данных с клавиатуры, однако запуск ее командой

PROCDAT < RAWDAT.001

приведет к автоматическому вводу информации из файла RAWDAT.001, который в данном случае ищется в текущем каталоге текущего диска. Поиск и открытие файла осуществляет DOS.

Иногда требуется выключить механизм перенаправления (возможно, лишь для определенных операторов ввода). Для этого следует открыть консоль для ввода как файл (с именем CON) функцией 3Dh, получить выделенный системой дескриптор, а затем использовать его в операциях ввода 3Fh:

;Поля данных

keybd db 'CON',0; Имя устройства

handle dw 0; Новый дескриптор

mov АН, 3Dh; Функция открытия

mov AL, О; Доступ для чтения

mov DX,offset keybd; Адрес имени устройства

int 21h

mov handle,AX; Получили дескриптор

Второй способ получения данных с клавиатуры в программу, с помощью функций DOS из диапазона 1..Ch, несколько более громоздок, но обеспечивает более разнообразные возможности. Вообще все функции DOS разделяются на две группы: фун­кции 1..Ch (все они обеспечивают ввод-вывод через стандарт­ные дескрипторы) и все остальные функции с номерами 0 и Dh...6Ch. Различие между указанными группами функций за­ключается в том, что при их выполнении DOS работает на разных стеках - стеке ввода-вывода, если вызываются функции из первой группы и стеке, получившим название дискового, при выполнении функций второй группы. Наличие двух стеков обеспечивает частичную реентерабельность (повторную входимость) DOS. Это свойство очень важно при обработке аппарат­ных прерываний и будет детально рассмотрено в последующих главах. В программах, не связанных с обработкой внешних ап­паратных прерываний, принадлежность функции той или иной группе не имеет значения, и при выборе для использования в программе следует руководствоваться чисто функциональными соображениями.

Для ввода с клавиатуры можно использовать 7 функций прерывания 1NT 21h:

0lh - ввод символа с эхом;

06h - прямой ввод -, вывод через консоль;

07h - ввод символа без эха и без отработки Ctrl/C

08h - ввод символа без эха и с отработкой Ctrl/C

0Ah - буферизованный ввод строки с эхом;

0Bh - проверка состояния стандартного устройства ввода

0Ch - сброс входного буфера и ввод.

Функции 0lh, 06h, 07h и 08h при каждом вызове вводят в программу один символ из кольцевого буфера ввода; при необ­ходимости ввести группу символов (строку) функции следует использовать в цикле. Различаются эти функции наличием или отсутствием эха, а также реакцией на ввод с клавиатуры соче­тания <Ctrl>/C. Функции 0lh и 0Ah отображают вводимые символы на экране (эхо); функции 07h и 08h этого не дела­ют, что дает возможность вводить данные тайком от окружаю­щих (например, пароль или ключ). Второе важное различие описываемых функций касается их реакции на ввод сочетания <Ctrl>/C. При выполнении функций 0lh и 08h DOS проверя­ет каждый введенный символ и, обнаружив во входном потоке код <Ctrl>/C (03h), аварийно завершает программу Функции же 06h и 07h пропускают код <Ctrl>/C в программу, не инициируя по нему никаких специальных действий. Такой ме­тод ввода используется прикладными программами, если перед завершением в них должны быть выполнены определенные про­граммные действия (сброс буферов на диск, модификация фай­лов и проч.). Аварийное завершение такой программы средства­ми DOS по коду <Ctrl>/C могло бы привести к нарушению ее работоспособности.

Функция 0Ah передает в буфер пользователя строку вве­денную с клавиатуры; строка должна заканчиваться нажатием клавиши <Enter>. Длина строки может достигать 254 симво­лов. Вводимые символы отображаются на экране; при вводе <Ctrl>/C происходит аварийное завершение программы

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

Функция 0Bh чувствительна к <Ctrl>/C. Это дает возмож­ность организовать с ее помощью аварийное завершение про­граммы на тех ее участках, где выполняются чисто процессор­ные действия. Если, например, включить вызов функции 0Bh в цикл, то при отсутствии ввода с клавиатуры цикл будет вы­полняться обычным образом, но после ввода <Ctrl>/C про­грамма аварийно завершится, хотя на выполняемом участке программы не используются функции ввода-вывода.

Функция 0Сh служит для организации ввода с предвари­тельной очисткой кольцевого буфера.

Все функции, кроме 0Ch, вводят в программу наиболее ста­рый из скопившихся в кольцевом буфере ввода символов, реа­лизуя тем самым возможность ввода с упреждением. В этом режиме оператор может нажимать на клавиши еще до выдачи программой запроса на ввод; коды нажатых клавиш (не более 15) будут накапливаться в кольцевом буфере ввода и извле­каться оттуда в программу по мере выполнения ею запросов на ввод. В отличие от этого, функция 0Ch сначала очищает кольцевой буфер и лишь затем ожидает ввода символа с кла­виатуры. В результате коды всех ранее нажатых (по предполо­жению - случайно) клавиш теряются. Обычно функция ввода 0Ch стоит в программе непосредственно вслед за функцией вы­вода на экран символьной строки с предложением оператору вводить данные. В результате из кольцевого буфера убирается весь "мусор" от случайных нажатий, в программу же поступа­ет лишь то, что вводится оператором после запроса программы. При этом режим ввода (с эхом или без него и т.д.) определя­ется тем, какая именно функция ввода (0lh, 07h, 08h или 0Ah) реализуется "внутри" функции 0Ch.

Все функции DOS ввода с клавиатуры допускают перена­правление ввода (из файла, последовательного порта, из вывода другой программы). Если требуется избавиться от этого качес­тва, следует использовать файловую функцию ввода 3Fh и спе­циально выделенный дескриптор.

Функции 0lh, 07h, 08h и 0Ah являются синхронными, т.е. при отсутствии символа в кольцевом буфере ждут его ввода. Функция 06h позволяет определить состояние кольцевого буфе­ра и при наличии в нем кода извлечь этот код и обработать его, а при отсутствии - продолжить выполнение программы.

Функции 0lh, 06h, 07h и 08h позволяют вводить в про­грамму расширенные коды ASCII. Для этого, обнаружив, что введенный код ASCII равен нулю, следует выполнить функцию повторно. Это дает возможность управления прикладными про­граммами с помощью функциональных клавиш, а также соче­таний <Alt>/цифра, <Alt>/буква и др.

Функции 06h, 07h и 08h позволяют вводить в программу коды символов с помощью сочетаний <АИ>/<цифра на ци­фровой клавиатуре (в том числе некоторые из первых 32 символов кодовой таблицы и всю вторую половину кодовой таблицы).

Сравнительные характеристики функций DOS ввода с клави­атуры приведены в табл. 5.2.

    01h 06h 07h 08h 0Ah 0Bh 0Ch
Эхо + - - - +     +/-
Реакция на ~С + - - + + + +/-
Перенаправление + + + + + + +
Ожидание символа + - + + + - +/-
Расширенные коды ASCII + + + + -     +
<A1t>+код - + + + -     +/-
Очистка буфера - - - - -     +

 

Работа с клавиатурой на уровне BIOS (INT 16h) позволяет считывать двухбайтовые коды, поступающие в кольцевой буфер ввода (код ASCII + скан-код) и анализировать слово флагов клавиатуры (нажатие клавиш <Shift>, <Caps Lock> и др.). Для ввода используются следующие функции прерывания INT 16h:

00h - чтение двухбайтового кода из входного буфера;

0lh - чтение состояния клавиатуры и двухбайтового кода без извлечения его из буфера;

02h - чтение флагов клавиатуры.

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

Функция 0lh относится к числу асинхронных: определив состояние клавиатуры (точнее - буфера ввода), она возвращает управление программе. Состояние буфера возвращается в флаге ZF: если в буфере имеются ожидающие ввода в программу символы, ZF-0, если же буфер пуст, ZF-1. При наличии в бу­фере кода символа его можно проанализировать, так как он возвращается функцией в регистре АХ (АН - скан-код, AL-код ASCII). Необходимо однако иметь в виду, что функция 0lh, копируя двухбайтовый код в регистр АХ, не очищает при этом кольцевой буфер. Забрать символ с очисткой буфера можно за­тем функцией 00h.

Функция 02h - чтение флагов клавиатуры - передает в про­грамму содержимое слова флагов (ячейка 417).. Она может ис­пользоваться программами, работающими на уровне скан-кодов, для определения состояния клавиш <Shift>, <Caps Lock> и др.




Поделиться с друзьями:


Дата добавления: 2015-07-13; Просмотров: 248; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.