Мегаобучалка Главная | О нас | Обратная связь


INT 2lh, функция 0Ch. Очистка входного буфера и ввод



2015-12-06 500 Обсуждений (0)
INT 2lh, функция 0Ch. Очистка входного буфера и ввод 0.00 из 5.00 0 оценок




Очищает кольцевой буфер клавиатуры и активизирует функцию ввода.

При вызове: AH=0Ch

АL="номер требуемой функции ввода.

Допустимы функции 01, 06, 07, 08, 0Ah DS:DX=адpec буфера (если AL=0Ah)

При возврате: АL=байт входных данных (если при вызове AL=0Ah, данные помещаются в буфер)

Функции 0lh, 06h, 07h и 08h при каждом вызове вводят в программу один символ из кольцевого буфера ввода; при необходимости ввести группу символов (строку) функции следует использовать в цикле. Различаются эти функции наличием или отсутствием эха, а также реакцией на ввод с клавиатуры сочетания <Сtrl>/С. Функции 0lh и 06h отображают вводимые символы на экране (эхо); функции 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 служит для организации ввода с предварительной очисткой кольцевого буфера. Все функции, кроме 0Сh, вводят в программу наиболее старый из скопившихся в кольцевом буфере ввода символов, реализуя тем самым возможность ввода с упреждением. В этом режиме оператор может нажимать на клавиши еще до выдачи программой запроса на ввод; коды нажатых клавиш (не более 15) будут накапливаться в кольцевом буфере ввода и извлекаться оттуда в программу по мере выполнения ею запросов на ввод- В отличие от этого, функция 0Сh сначала очищает кольцевой буфер и лишь затем ожидает ввода символа с клавиатуры. В результате коды всех ранее нажатых (по предположению -случайно) клавиш теряются. Обычно функция ввода 0Сh стоит в программе непосредственно вслед за функцией вывода на экран символьной строки с предложением оператору вводить данные. В результате из кольцевого буфера убирается весь "мусор" от случайных нажатий, в программу же поступает лишь то, что вводится оператором после запроса программы. При этом режим ввода (с эхом или без него и т.д.) определяется тем, какая именно функция ввода (0lh, 06h, 07h, 08h или 0Ah) реализуется "внутри"функции 0Сh.

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

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

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

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

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

    0lh 06h 07h 08h 0Ah 0Bh 0СЬ
Эхо + + - +     +/*
Реакция на <Ctri>/C + - - + + + +/-
Перенаправление + + + + '+ + +
Ожидание символа + - + 4- + - +/-
Расширенные ASCII + + + + -     +
<Аlt>+код - + + + -     +/-
Очистка буфера - - - - -     +

 

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

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

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

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

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

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

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

 

Задание к лабораторной работе.

1)Напишите программу для ввода своей фамилии, используя 1)функцию 01h и 2) 0Сh(c функцией 08h). Результат ввода выведите на монитор с помощью функции DOS 40h

2. Наберите и отладьте программу (используйте директивы упрощенного описания сегментов). Используйте команды: TASM /zi <filename.asm> и Tlink /v <filename.obj>

a).

mov cx, <количество букв в Вашей фамилии>

m1:

mov ah,00

int 16h

loop m1

mov ax, 4c00h

int 21h

 

b) С помощью td.exe определите скен-коды клавиш, которыми Вы набираете свою фамилию. Результат занесите в протокол. Зависит ли результат от: 1) регистра (нижний верхний). 2)русского или английского написания фамилии.

с) Определите и запишите в протокол скен-коды функциональных клавиш:

F<ваш номер в группе>

Return, DEL, INSERT, PgUp, PgDn, HOME, END, BACKSPACE

 



2015-12-06 500 Обсуждений (0)
INT 2lh, функция 0Ch. Очистка входного буфера и ввод 0.00 из 5.00 0 оценок









Обсуждение в статье: INT 2lh, функция 0Ch. Очистка входного буфера и ввод

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (500)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)