КАТЕГОРИИ: Архитектура-(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.
Работа с клавиатурой на уровне 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; Просмотров: 265; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |