Dos fn 03h вспомогательный ввод


Содержание

Dos fn 03h: вспомогательный ввод

Добавление от 30.03.2009 21:44:

Разобрался, всё из за 4 Гб оперативки.

6. selector12 , 19.01.2012 15:20
Здравствуйте! Такая проблема — не устанавливаются драйвера на видеокарту. Так же иногда при включении компьютера появляется рябь экрана, но после нескольких перезагрузок становится нормальное изображение. Такая проблема появилась то ли после установки какой-то игры, то ли после отключения электричества (еще сгорел монитор), сразу не обратил внимания.. Подскажите в чем может быть проблема, и какие пути решения: перепрошивать биос (что боюсь) или сдохла видеокарта или сдохла материнка?

Вот что написано также в свойствах:
Диапазон ввода/вывода 03B0 — 03BB уже используется:
Intel(R) 915G/P/GV PCI Express Root порт — 2581
Диапазон ввода/вывода 03C0 — 03DF уже используется:
Intel(R) 915G/P/GV PCI Express Root порт — 2581
Диапазон памяти 000A0000 — 000BFFFF уже используется:
Intel(R) 915G/P/GV PCI Express Root порт — 2581

В списках конфликта:
Порт ввода/вывода 0x00000000-0x00000CF7 Шина PCI
Порт ввода/вывода 0x00000000-0x00000CF7 Контроллер прямого доступа к памяти

Порт ввода/вывода 0x000003C0-0x000003DF Intel(R) 915G/P/GV PCI Express Root порт — 2581
Порт ввода/вывода 0x000003C0-0x000003DF VgaSave

Адрес памяти 0xFFF80000-0xFFFFFFFF Ресурсы системной платы
Адрес памяти 0xFFF80000-0xFFFFFFFF Intel(R) 82802 Firmware концентратор

Порт ввода/вывода 0x00000400-0x0000041F Ресурсы системной платы
Порт ввода/вывода 0x00000400-0x0000041F Intel(R) 82801FB/FBM SMBus контроллер — 266A

IRQ 23 Intel(R) 82801FB/FBM USB универсальный хост-контроллер — 2658
IRQ 23 Intel(R) 82801FB/FBM USB2 расширенный хост-контроллер — 265C

Порт ввода/вывода 0x0000E000-0x0000EFFF Intel(R) 915G/P/GV PCI Express Root порт — 2581
Порт ввода/вывода 0x0000E000-0x0000EFFF Видеоконтроллер (VGA-совместимый)

IRQ 16 Intel(R) 915G/P/GV PCI Express Root порт — 2581
IRQ 16 Драйвер шины Microsoft UAA для High Definition Audio
IRQ 16 Intel(R) 82801FB/FBM PCI Express Root порт — 2660
IRQ 16 Intel(R) 82801FB/FBM USB универсальный хост-контроллер — 265B

Адрес памяти 0xE0000000-0xEFFFFFFF Ресурсы системной платы
Адрес памяти 0xE0000000-0xEFFFFFFF Ресурсы системной платы

Адрес памяти 0xD0000000-0xDFFFFFFF Intel(R) 915G/P/GV PCI Express Root порт — 2581
Адрес памяти 0xD0000000-0xDFFFFFFF Видеоконтроллер (VGA-совместимый)

IRQ 19 Intel(R) 82801FB/FBM USB универсальный хост-контроллер — 2659
IRQ 19 Marvell Yukon 88E8001/8003/8010 PCI Gigabit Ethernet Controller
IRQ 19 Intel(R) 82801FB Ultra ATA Storage контроллеры — 2651

Адрес памяти 0xA0000-0xBFFFF Шина PCI
Адрес памяти 0xA0000-0xBFFFF Intel(R) 915G/P/GV PCI Express Root порт — 2581
Адрес памяти 0xA0000-0xBFFFF VgaSave

Когда клавиши Fn на ноутбуке работают наоборот или вообще не работают

#Fn Поскольку стандартные pc-клавиатуры имеют строго определенное количество клавиш, для расширения функционала, на клавиатурах (особенно ноутбучных) есть спец. клавиша Fn. Вот, например, список горячих клавиш windows 8.

При нажатии на нее у остальных кнопок задействуются вторые значения. Например на ноутбуке Samsung np530 клавиша f2 в сочетании с fn понижает громкость системных динамиков, хотя в обычном режиме f2 может быть использована как вспомогательная клавиша windows, например, для переименования файлов и папок.

Есть один интересный момент — иногда второстепенные значения клавиш меняются местами с основными т.е. клавиатура начинает работать наоборот:

В случае с указанным самсунгом, это будет выглядеть так будто f2 теперь отвечает за понижение громкости, а чтобы переименовать папку Windows теперь нужно нажимать Fn+f2.

Это неудобно, особенно если учесть, что стрелки «вправо» и «влево» теперь превращаются в «End» и «Home», для тех кто набирает много текста и привык работать не только с мышью это неудобно.

Вообще с Fn может быть несколько неудобных моментов, давайте разбираться:

1) Клавиатура с Fn работает наоборот.

Т.е. вышеописанная ситуация. Причины возникновения и пути решения:

— На клавиатуре нажата клавиша «Fn lock» (не путать с «f lock»), она меняется значения клавиш с первостепенных на второстепенные. Для того чтобы это прекратить просто нажмите её один раз.

— В BIOS ноутбука включена соответствующая опция. Чтобы пофиксить эту проблему ищите в биосе настройки связанные с такими названиями как «Action keys mode» или «Behavior-Functions Key» или «hot key function» или что то аналогичное, зависит от модели ноутбука. Это значение нужно выставить в disabled. Допускаю, что на некоторых моделях ноутбуков нужно сменить его на Enabled. Выглядит это примерно так:

2) Вместо букв на клавиатуре печатаются цифры

Просто отключите это безобразие комбинацией Fn+Nun lock (NumLk)

3) Клавиши Fn не работают или работают некорректно

— Некорректно установлены (не установлены вообще) драйвера для задействования вспомогательных клавиш. Такие драйверы всегда есть на сайте производителя вашего ноутбука. По какой то причине они могут работать некорректно.

Оп! А вот тут хорошо ремонтируют ноутбуки в Белгороде. листаем дальше.

Особенно часто такое бывает если ноутбук предназначен для Windows 7, а вы поставили на него windows 8. Переустановите драйвера «горячих клавиш» (hotkey).

Иногда просто помогает их удаление, тогда их драйвера подменяются стандартными драйверами Windows и некоторые из клавиш Fn также не будут работать.

Название драйверов для «горячих клавиш» у разных производителей ноутбуков разное:

hpHotkeyMonitor — HP
ATK — Asus
Launch Manager — Acer
Hotkey Utility — Sony Vaio
ATK Hotkey — lenovo

Функция DOS 3Dh — Открыть существующий файл

Дата добавления: 2013-12-23 ; просмотров: 1070 ; Нарушение авторских прав

Признаком ошибки при выполнении функции DOS является взведенный флаг С (переноса).

В конце работы файл следует закрыть.

Работа с файлами.

Объединения

Getfield имя_элемента_записи, регистр_назначения, источник

Setfield имя_ элемента_записи, назначение, регистр_источник

Дополнительные возможности обработки

В ассемблере существуют команды, которые позволяют скрыть от программиста действия по выделению и установке отдельных полей записи.

Для установки значения некоторого поля записи используется команда setfield с синтаксисом:

Для выборки значения некоторого поля записи используется команда getfield с синтаксисом:

Ассемблер даёт возможность переопределить область памяти для объекта с другими типом и именем с помощью специального типа данных, называемого объединением. Объединение — тип данных, позволяющий трактовать одну и ту же область памяти как имеющую разные типы и имена.

При описании объединений в программе сначала описывается шаблон, в котором с помощью директив описания данных перечисляются имена и типы полей:

имя_объединения UNION

имя_обьединения ENDS

Отличие объединений от структур состоит в том, что при определении переменной типа объединения память выделяется в соответствии с размером максимального элемента. Обращение к элементам объединения происходит по их именам, но при этом все поля в объединении накладываются друг на друга. Одновременная работа с элементами объединения исключена. В качестве элементов объединения можно использовать и структуры.

Метод работы с файлами в системе MS DOS называется методом описателя или дескриптора. Идея работы с файлами методом описателя в MS DOS заключается в следующем:


1. Вначале файл должен быть открыт, при этом должно быть указано имя файла — либо полное (полный путь), либо краткое. В последнем случае файл берется из текущего каталога. В конце имени файла должен стоять код 0.

2. После того как файл был удачно открыт, ему присваивается описатель — число от 5 до 256 (записывается в регистр АХ). Дальнейшая работа с файлом будет вестись через этот описатель. Под таблицу описателей отводится 20 байт, поэтому программа не может открыть одновременно более 20 файлов.

Количество одновременно открытых файлов (включая предопределенные файлы) не может превышать 20, хотя количество описателей может быть больше. Поскольку 5 первых описателей всегда открыто, то получается, что можно одновременно открыть не более 15 файлов.

Описатель файла – это некий индекс, по которому можно найти область памяти, выделяемую для работы с данным файлом. Эта область памяти необходима для того, чтобы буферизовать ввод и вывод в этот файл,что делает работу с ним более быстрой. При записи в файл данные записываются сначала в буфер и, только если он переполнен, записываются на диск.

При закрытии файла содержимое буфера записи сбрасывается на диск, и далее этот буфер может использоваться для работы с другим файлом. Данные незакрытого файла могут оказаться потерянными.

При открытии выделяются буфера отдельно на чтение и запись. В MS DOS имеется функция 68Н, с помощью которой можно сбрасывать буфера, выделенные для записи, на диск, не закрывая файла. Эту функцию часто используют для того, чтобы обезопасить себя от возможной потери данных. Аналог ее имеется во всех языках высокого уровня.

DOS поддерживает как работу с длинными именами, так и с короткими именами файлов и каталогов.

При открытии или создании файла, DOS возвращает в регистр АХ описатель файла или HANDLE -двухбайтное число. Все операции с данным файлом после этого можно производить, зная только это число.

Стандартным устройствам ввода-вывода по умолчанию присваиваются свои описатели — от 0 до 4. Вот эти описатели:

● STDIN стандартное устройство ввода (клавиатура) — 0,

● STDOUT стандартное устройство вывода (экран) -1,

● STDERR устройство для вывода ошибок (обычно экран) — 2,

● AUX асинхронный порт(СОМ1) — 3,

● PRN печатающее устройство (LPT1) — 4.

Это позволяет перенаправить ввод или вывод с одного устройства на другое.

Можно выделить четыре аспекта работы с файлами в программах на ассемблере:

– работа с системой файлового ввода-вывода MS DOS, использующей короткие имена;

– работа с системой файлового ввода-вывода MS DOS, использующей длинные имена (длиной до 255 символов);

– работа с системой файлового ввода-вывода Win 32;

– использование файлов особого вида, поддерживаемых Win 32 — проецированных на память.

Ввод: AH = 3Dh

AL = режим доступа

биты 0-1: открыть для записи или для чтения

Ввод информации с клавиатуры при помощи функций BIOS

Клавиатура является основным устройством ввода алфавитно-цифровой информации, а часто — и основным средством управления работой компьютера. Для ввода информации с клавиатуры можно использовать либо функции операционной системы, либо прямой опрос контроллера клавиатуры. Мы не будем рассматривать функции MS-DOS, используемые для ввода данных с клавиатуры, так как они достаточно подробно описаны в литературе [3, 10], но непригодны для сколько-нибудь серьезной работы. Функции DOS имеют два очень серьезных недостатка. Первый недостаток заключается в том, что они не позволяют полностью реализовать возможности функциональных клавиш. Второй недостаток — клавиатурные функции DOS предназначены для работы в режиме терминала (с построчным выводом информации сверху вниз и прокруткой изображения снизу вверх). В процессе считывания символа они выполняют ряд дополнительных операций, что делает весьма неудобным их использование в любом другом, не терминальном режиме.

Функции BIOS обладают гораздо более широкими возможностями, чем функции DOS. Этих возможностей вполне достаточно для выполнения любых операций реальном режиме работы процессора. Вызов клавиатурных функций BIOS выполняется по прерыванию Int 16h. Рассмотрим эти функции.

Прерывание Int 16h, функция 00h: прочитать символ с клавиатуры

Функция 00h считывает символ из буфера клавиатуры и выдает его ASCII-код и скан-код (символ после считывания будет удален из буфера клавиатуры).

Перед вызовом прерывания требуется записать в регистр АН значение 00h.

После выполнения функции в регистры будет помещена следующая информация:

• в АН — скан-код символа;

• в AL — ASCII-код символа.

При нажатии управляющих клавиш функция выдает ASCII-код со значением 0, благодаря чему их легко можно отличить от алфавитно-цифровых. Однако друг от друга управляющие клавиши, таким образом, отличаются только по скан-кодам.

Прерывание Int 16h, функция 01 h: получить состояние клавиатуры

Функция Olh проверяет наличие символа в буфере клавиатуры. Если символ присутствует в буфере, функция выдает его ASCII-код и скан-код (не удаляя символ из буфера).

Перед вызовом прерывания требуется записать в регистр АН значение Olh.

После выполнения функции при отсутствии символа в буфере будет установлен флаг ZF. При наличии символа в буфере флаг ZF будет сброшен и в регистры помещена следующая информация:

• в АН — скан-код символа;

• в AL — ASCII-код символа.

Данная функция применяется в тех случаях, когда для управления работой программы используется не только клавиатура, но и другие устройства. Простейший способ работы в этом случае — поочередный циклический опрос всех источников информации. Использовать функцию, аналогичную 00h, нельзя — она заблокирует опрос всех остальных устройств до тех пор, пока не будет введен какой- либо символ с клавиатуры. Поэтому в цикле осуществляется только контроль поступления новой информации, а считывание информации выполняется вне цикла.

Прерывание Int 16h, функция 02h: получить состояние флагов клавиатуры

Функция 02h выдает содержимое байта флагов BIOS. Перед вызовом прерывания требуется записать в регистр АН значение 02h.

После выполнения функции регистр AL содержит описание состояния флагов:

• бит 0 — правая клавиша Shift (0 — не нажата, 1 — нажата);

• бит 1 — левая клавиша Shift (0 — не нажата, 1 — нажата);

• бит 2 — клавиша Ctrl (0 — не нажата, 1 — нажата);

• бит 3 — клавиша Alt (0 — не нажата, 1 — нажата);

• бит 4 — переключатель Scroll Lock (0 — выключен, 1 — включен);

• бит 5 — переключатель Num Lock (0 — выключен, 1 — включен);

• бит 6 — переключатель Caps Lock (0 — выключен, 1 — включен);

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

Прерывание Int 16h, функция 03h: управление режимом автоповтора

Функция 03h устанавливает характеристики режима автоповтора.

Перед вызовом прерывания требуется записать в регистры следующую информацию:


• в АН — значение 03h;

• в AL — значение 05h;

• в ВН — код, задающий значение задержки автоповтора (табл. 1.4);

• в BL — код, задающий скорость повторения (табл. 1.5).

Ассемблер

Прерывание 21h: функции DOS для работы с буфером клавиатуры

Различные служебные функции DOS для работы с буфером клавиатуры (функции 01h, 06h, 07h, 08h, 0Ah, 0Bh и 0Ch) классифицируются прежде всего по трем критериям: ожидают ли они ввода или же, когда символ не получен, сообщают, что ввода нет; выдают ли они на экран дисплея эхо (введенный символ); и реагирует ли функция на ввод стандартного символа прерывания во время ее исполнения. (Напомним, что нажатие комбинации клавиш Ctrl-Break или Ctrl-C рассматривается как прерывание ограниченным числом стандартных функций DOS. Однако, начиная с версии 2.00, в DOS введена команда BREAK ON, которая дает указание DOS реагировать на ввод символа прерывания при всех обстоятельствах.)

Все функции ввода с клавиатуры получают введенный символ из буфера клавиатуры, размещенного в памяти компьютера, а не непосредственно из порта 60h интерфейса клавиатуры (из порта 60h скан-коды считываются прерыванием 09h, переводятся в коды символов и помещаются в буфер клавиатуры).

Функция 1 прерывания 21h: ввод символа с эхопечатью

Функция 01h ждет появления символа в буфере клавиатуры со стандартного устройства ввода и после приема символа помещает его в регистр AL. Другие функции, относящиеся к вводу символов с клавиатуры: 06h, 07h и 08h.

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

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

Обычно функция 01h применяется для проверки принадлежности символа, соответствующего нажатой клавише, коду ASCII. Для этого производится проверка регистра AL. Если AL не равно 00h, то это символ кода ASCII. Если же AL=00h, то вы имеете дело с символом, не относящимся к коду ASCII; в этом случае следует повторить обращение к данной функции для получения псевдокода, соответствующего специальному действию клавиши. Как и в случае применения других средств DOS, предназначенных для ввода символов с клавиатуры, при использовании данной функции развернутый код символов набора ASCII оказывается недоступным, даже если соответствующие средства обслуживания клавиатуры системы ROM BIOS позволяют осуществить доступ к нему.

Функция 6 прерывания 21h: непосредственный ввод

и вывод с консоли

Функция 06h — это универсальная функция, объединяющая операции ввода с клавиатуры и вывода на дисплей. В версиях DOS, начиная со второй и выше, эта функция, как и другие, действует по отношению уже не к клавиатуре и дисплею, а к стандартным устройствам ввода и вывода (в качестве которых по умолчанию принимаются клавиатура и дисплей).

При реализации данной функции регистр AL используется для ввода, а регистр DL — для вывода. Если при вызове функции 06h в регистре DL находится значение FFh (в десятичной нотации 255), то при нажатии какой-либо клавиши эта функция поместит соответствующий ASCII-код в регистр AL и сбросит нулевой флаг; при отсутствии нажатия клавиши она установит нулевой флаг.

Если же вызвать функцию 06h при любом другом значении регистра DL, то будет выполнен вывод символа, соответствующего данному значению, на стандартное устройство вывода.

Функция 06h не ожидает ввода символа с клавиатуры и не осуществляет его эхопечати на экране. Кроме того, функция 06h не воспринимает сочетание клавиш Ctrl-C как прерывание программы (при использовании данного сочетания она помещает в регистр AL значение 03h, т.е. соответствующий данному значению ASCII-код).

Функция 7 прерывания 21h: непосредственный ввод

с консоли без эхопечати

Функция 07h ожидает ввода символа со стандартного устройства ввода и после ввода символа помещает его в регистр AL. Она не осуществляет эхопечати символа на экране и не воспринимает сочетание клавиш Ctrl-C как прерывание программы.

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

Функция 8 прерывания 21h:

ввод с консоли без эхопечати

Функция 08h ожидает ввода символа, не осуществляя эхопечати и прерывает программу при нажатии Ctrl-C.

Эта функция идентична функции 01h, за исключением того, что она не выводит введенный символ на экран дисплея (или стандартное устройство вывода).

Для более полного понимания особенностей данной функции обратитесь к описанию функции 01h. Сравните данную функцию с функциями 01h, 06h и 07h. Если вы хотите использовать функцию 08h, но не желаете ждать ввода символа, изучите функцию 0Bh, которая сообщает о готовности ввода. Изучите также функцию 0Ch, которая является модификацией данной функции.

Dos fn 03h: вспомогательный ввод

Связь с администрацией сайта:

Среди толпы я одинок

  • Вы здесь:
  • Home >
  • Блог >
  • Документация и курсы >
  • Самоучитель по ассемблеру >
  • Глава 18 — практика: работа с файлами, перехват и восстановление прерываний

Глава 18 — практика: работа с файлами, перехват и восстановление прерываний

  • Written by Administrator
  • Tagged under АссемблерAssemblerСамоучитель по ассемблеру
  • Print

Замечание! Это пожалуй самая большая глава! информация представленная в ней в принципе довольно важна! К сожалению при работе в NT/Windows 2000/XP вам не удастся опробовать пример! Тут нужен чистый DOS, или хотя бы Win9x! Я например воспользуюсь эмулятором!

Работа с файлами через описатели

Если программы, написанные на языках высокого уровня могут открыть файл без выполнения подготовительных действий (они выполняются автоматически), то ассемблерные программы должны создать специальные области данных, которые используются при операциях ввода/вывода. Используется два метода доступа к файлам: метод управляющего блока файла (FCB) и метод дескриптора файла. С помощью метода FCB можно получить доступ только к файлам, находящимся в текущем каталоге. Метод дескриптора файла позволяет получить доступ к любому файлу, независимо от того, какой каталог является текущим.
Начиная с DOS версии 2.0, в набор функций прерывания 21h включе-ны UNIX-подобные файловые функции. Идея их состоит в том, что, когда программа открывает файл, DOS возвращает 16-битовое значение «описателя файла» (дескриптора файла) (handle). После этого, когда программа читает, позиционирует, пишет или закрывает файл, она ссылаетесь на него через описатель. Одно из самых больших удобств – то, что можно обращаться к некоторым устройствам так, как будто это дисковые файлы, через зарезервированные описатели DOS:

Ниже приведен перечень наиболее часто используемых функций пре-рывания 21h для работы с файлами через описатели.
Функция 3cH
Создать файл.
Вход. AH=3ch
DS:DX=адрес строки ASCIIZ с именем файла
CX=атрибут файла
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет.
Описание. Файл создается в указанном (или умалчиваемом) оглав-лении и открывается в режиме доступа «чтение/запись». Если файл уже существует, то при открытии файл усекается до нулевой длины. Если атрибут файла – «только чтение», открытие отвергается (атрибут можно изменить функцией 43H).
Функция 5bH
Создать новый файл (не должен существовать).
Вход. AH=5bh
DS:DX=адрес строки ASCIIZ с именем файла
CX=атрибут файла
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет
Описание. Этот вызов идентичен функции 3ch, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует.
Функция 5aH
Создать уникальный файл.
Вход. AH=5ah
DS:DX=адрес строки ASCIIZ с путем (заканчивается \)
CX=атрибут файла
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет
DS:DX (не изменяется) становится полным
ASCIIZ-именем нового файла.
Описание. Открывает (создает) файл с уникальным именем в оглав-лении, указанном строкой ASCIIZ, на которую указывает DS:DX. Описа-ние пути должно быть готово к присоединению в его конец имени файла. Необходимо обеспечить минимум 12 байт в конце строки. После возврата строка DS:DX будет дополнена именем файла. DOS создает имя файла из шестнадцатеричных цифр, получаемых из текущих даты и времени. Ес-ли имя файла уже существует, DOS продолжает создавать новые имена, пока не получит уникальное имя.
Функция 3dH
Открыть файл.
Вход. AH=3dh
DS:DX=адрес строки ASCIIZ с именем файла
AL=режим открытия
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет
Описание. В момент открытия файл должен существовать. Файл открывается в выбранном режиме доступа (AL = 0 – для чтения; AL = 1 – для записи; AL = 2 – для чтения и записи) и указатель «чтения/записи» ус-танавливается в 0.
Функция 3eH
Закрыть файл.
Вход. AH=3eh
BX=описатель файла
Выход. AX= код ошибки, если CF установлен
Описание. BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфер сбрасываются, а оглавление обновляется корректными размером, временем и датой.
Функция 41H
Удалить файл.
Вход. AH=41h
DS:DX=адрес строки ASCIIZ с именем файла
Выход. AX=код ошибки, если CF установлен
Описание. Имя файла не может содержать обобщенные символы («?» и «*»). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изме-нить этот атрибут через функцию 43H.
Функция 42H
Установить указатель чтения/записи (можно также узнать размер файла).
Вход. AH=42h
BX=описатель файла
CX:DX=смещение указателя: (CX * 65536) + DX
AL=0 переместить к началу файла + CX:DX
AL=1 переместить к текущей позиции + CX:DX
AL=2 переместить к концу файла — CX:DX
Выход. AX=код ошибки, если CF установлен
DX:AX=новая позиция указателя файла (если нет
ошибки)
Описание. Перемещает логический указатель чтения/записи к нужному адресу, с которого начнется очередная операция чтения или за-писи. Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. DX здесь старшее значащее слово: действительная длина (DX * 65536) + AX.
Функция 3fH
Читать из файла/устройства.
Вход. AH=3fh
BX=описатель файла
DS:DX=адрес буфера для чтения данных
CX=число считываемых байт
Выход. AX=код ошибки, если CF установлен
AX=число действительно прочитанных байт
Описание. CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей програм-мы, адресуемый через DS:DX.
Всегда необходимо сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт):
1) если AX=CX, (и CF сброшен) – чтение было корректным без ошибок;
2) если AX=0 – достигнут конец файла (EOF);
3) если AX
Функция 40H
Писать в файл/устройство.
Вход. AH=40h
BX=описатель файла
DS:DX=адрес буфера, содержащего данные
CX=число записываемых байт
Выход. AX=код ошибки, если CF установлен
AX=число действительно записанных байт
Описание. CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX и записываются, начиная с текущей позиции указателя чтения/записи файла. Необходимо всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи): если AX = CX, запись была успешной; если AX
Некоторые функции в качестве параметра используют атрибут файла. Атрибут — это один байт битовых флагов, связанный с каждым файлом и находящийся в элементе оглавления для файла. В атрибуте определены следующие биты:
x x A D V S H R
R- только чтение (нельзя обновлять или удалять);
H- скрытый;
S- системный;
V- метка тома;
D- элемент подоглавления;
A- архивный;
x- не используются.
ASCIIZ строка, содержащая имя файла, имеет вид:

«‘d:\путь\имя_файла’,0»

Если диск и/или путь опущены, они принимаются по умолчанию. После вызова функции описатель файла должен быть сохранен для последующих операций. Количество описателей в системе регламентируется файлом CONFIG.SYS.
Приведенный ниже пример иллюстрирует процесс работы с файлом через описатели в ассемблерной программе.

;Создание файла
MOV AH,3CH
MOV CX,0
LEA DX,BUF ;DS:DX – адрес ASCIIZ строки с именем
INT 21H
JC NO_CREATE ;Проверка флага переноса
. . . ;Работа с файлом
NO_CREATE:
. . .
BUF DB ‘d:\Users\1.txt’,0

Работа с файлами через DTA

Как было сказано ранее, используются два метода доступа к файлу: метод управляющего блока файла (FCB) и метод дескриптора файла. В любом случае программа при работе с файлами должна указывать место в памяти, куда будут помещаться принимаемые данные или откуда будут извлекаться выводимые. Обычно временный буфер устанавливается раз-мером в одну запись и бывает удобно описать его как строковую переменную в сегменте данных.
Буфер, используемый методом FCB доступа к файлам, называется областью обмена с диском или DTA. На этот буфер указывает условный указатель, который хранится операционной системой и который может быть изменен программой. В документации этот указатель на DTA часто сам называют DTA. Указатель на DTA устанавливается специальной функцией DOS и после того как он установлен все функции чтения/записи автоматически обращаются к нему. Это означает, что сами функции не должны содержать адрес временного буфера.
Для установки указателя на DTA используется функцию 1AH прерывания 21H (DS:DX должны указывать на первый байт DTA). Функция 2FH прерывания 21H сообщает текущую установку указателя DTA (при возврате ES:BX содержат сегмент и смещение DTA).
Префикс программного сегмента PSP обеспечивает каждую программу 128-байтным встроенным DTA, начиная со смещения 80H и до 9FH. Программа может использовать его при нехватке памяти. Первоначально указатель на DTA указывает именно на этот буфер, поэтому если программа будет использовать его, то нет нужды устанавливать указатель. Этот буфер по умолчанию особенно удобно использовать с COM файлами, где DS указывает на начало префикса программного сегмента. Для файлов EXE может потребоваться небольшой добавочный код, чтобы использовать DTA по умолчанию.


Примечание: после извлечения года к нему необходимо прибавить 1980.
Существует ряд функций для работы с файлами, используя DTA. Наиболее употребимые из них приведены ниже.
Функция 1ah
Установить адрес DTA.
Вход. AH=1aH
DS:DX=адрес для DTA
Выход. Нет
Описание. Устанавливает адрес DTA.
Функция 2fh
Дать текущий DTA.
Вход. AH=2fH
Выход. ES:BX=адрес для DTA
Описание. Возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться со-хранить адрес DTA, а впоследствии восстановить его посредством функ-ции 1aH.
Функция 4eh
Найти 1-й совпадающий файл.
Вход. AH=4eH
DS:DX=адрес строки ASCIIZ с именем файла
CX=атрибут файла для сравнения
Выход. AX=код ошибки, если CF установлен
DTA=заполнена данными (если не было ошибки)
Описание. DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они подразумевают-ся по умолчанию. Обобщенные символы * и ? допускаются в имени файла и расширении. DOS находит имя первого файла в оглавлении, которое совпадает с заданным именем и атрибутом, и помещает найденное имя и другую информацию в DTA.
Функция 4fh
Найти следующий совпадающий файл.
Вход. AH=4fH
DS:DX= адрес данных, возвращенных предыдущей 4eH.
Выход. AX=код ошибки, если CF установлен
DTA=заполнена данными (если не было ошибки)
Описание. DS:DX указывает на 2bH-байтовый буфер с информаци-ей, возвращенной функцией 4eH (либо DTA, либо буфер, скопированный из DTA).Необходимо использовать эту функцию после вызова 4eH. Сле-дующее имя файла, совпадающее по обобщенному имени и атрибуту фай-ла, копируется в буфер по адресу DS:DX вместе с другой информацией (см. функцию 4eH о структуре файловой информации в буфере, заполняе-мом DOS).
Ниже приведен фрагмент программы, иллюстрирующий организацию поиска файлов в текущем каталоге.

;Установить адрес DTA
MOV AH,01AH
LEA DX,FDTA
INT 21H
. . .
;Наити первый совпадающий файл
MOV AH,4EH
LEA DX,MASKA
MOV CX,10H
INT 21H
JC EXIT
NEXT:
. . .
;Найти следующий совпадающий файл
MOV AH,4FH
MOV CX,10H
LEA DX,MASKA
INT 21H
JNC NEXT
EXIT:
. . .
;========== DTA =========
FDTA DB 15H DUP (?)
FATTR DB ?
FTIME DW ?
FDATA DW ?
FSIZE DD ?
FNAME DB 0DH DUP (‘$’)
;========================
MASKA DB ‘*.*’,0

Структура PSP

Префикс программного сегмента PSP (Program Segment Prefics) – специальная область оперативной памяти размером 256 (100h) байт. PSP может использоваться в программе для определения имен файлов и пара-метров из командной строки, введенной при запуске программы на выпол-нение, объема доступной памяти, переменных окружения системы и так далее. После загрузки программы в память сегментные регистры DS и ES указывают на начало PSP этой программы.

Окружение DOS

DOS поддерживает область памяти, содержащую набор строк ASCIIZ, которые могут использоваться приложениями для получения некоторой системной информации и для передачи данных между программами. Эта область памяти называется окружением DOS.
Структура окружения DOS:

имя_1=значение_1«0»
имя_2=значение_2«0»
. . .
имя_N=значение_N«0»
«0»
«xxxx»
EXEC_string_1«0»
. . .
EXEC_string_NN«0»
«0»

Здесь «0» — это символ ASCII NUL (00H), а «xxxx» — 16-битовое дво-ичное значение (количество дополнительных строк).
Окружение не превышает 32K байт и начинается на границе парагра-фа. Смещение 2cH в PSP текущей программы содержит номер параграфа окружения. Используя окружение, можно найти нужное имя’ серией срав-нений строк ASCIIZ, пока не достигнута пустая строка (нулевой длины), что указывает конец окружения.
В последних версиях DOS, за концом официального окружения по-мещается дополнительная строка, которая содержит диск и путь, с которых была загружена программа. Вслед за последней строкой ASCIIZ окруже-ния находится нулевой байт, указывающий конец официального окруже-ния. Следующие два байта содержат 16-битовый двоичный счетчик допол-нительных строк (обычно 0001H). Вслед за значением счетчика находится строка ASCIIZ, содержащая путь и имя файла. Это в точности та строка, которая использовалась функцией DOS 4bH (EXEC) для загрузки и запуска программы.

Работа с прерываниями

Иногда необходимо выполнить одну из набора специальных проце-дур, если в системе или в программе возникают определенные условия, например, нажата клавиша на клавиатуре. Действие, стимулирующее вы-полнение одной из таких процедур, называется прерыванием. Существует два общих класса прерываний: внутренние и внешние. Первые иницииру-ются состоянием ЦП или командой, а вторые — сигналом, подаваемым от других компонентов системы.
Переход к процедуре прерывания осуществляется из любой програм-мы, а после выполнения процедуры прерывания обязательно происходит возврат в прерванную программу. Перед обращением к процедуре преры-вания должно быть сохранено состояние всех регистров и флагов, исполь-зуемых процедурой прерывания, а после окончания прерывания эти реги-стры должны быть восстановлены.
Последовательность прерывания состоит в следующем:
1) текущее значение регистра Flags включается в стек;
2) текущее значение регистра CS включается в стек;
3) текущее значение регистра IP включается в стек;
4) сбрасываются флаги IF и TF.
Новое содержимое IP и CS определяет начальный адрес выполняемой процедуры прерывания (обслуживание прерывания). Возврат в прерван-ную программу осуществляется командой, которая извлекает из стека со-держимое для IP, CS и регистра флагов (обычно это команда IRET).
Адреса подпрограмм обслуживания прерываний (вектора прерыва-ний) хранятся в таблице векторов прерываний. Таблица векторов прерыва-ний располагается по адресу 0000:0000 и представляет собой массив из 256 элементов, каждый элемент которого занимает 4 байта и представ-ляет собой начальный адрес процедуры обработки прерывания.
Иногда в программе возникает необходимость переопределения (пе-рехвата) прерываний (например, выполнение дополнительных действий при нажатии определенной клавиши клавиатуры). Процесс перехвата пре-рываний состоит в следующем:
1) подготавливается FAR-процедура – новый обработчик прерыва-ний (должна заканчиваться командой IRET);
2) сохраняется старый вектор прерывания (функция 35h прерывания 21h)
3) адрес нового обработчика заносится в таблицу векторов прерыва-ний (функция 25h прерывания 21h);
4) в конце программы происходит восстановление первоначального обработчика прерываний.
Функция 35h
Вход. AH=35H
AL=номер прерывания (00H до 0ffH)
Выход. ES:BX=адрес обработчика прерывания
Описание. Возвращает значение вектора прерывания для INT (AL),
то есть загружает в BX 0000:[AL*4], а в ES –
0000:[(AL*4)+2].
Функция 25h
Вход. AH=25H
AL=номер прерывания (00H до 0ffH)
DS:DX=вектор прерывания (адрес подпрограммы)
Выход. Нет
Описание. Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. Это равно-сильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, в момент записи прерывания будут заблокированы.

Разбор практической программы

Задание: Создать текстовый файл «Dir.Txt», содержащий перечень файлов в текущем каталоге. Написать программу переопределения прерывания 05h (клавиша Print Screen).
Примечание:
1) файл «Dir.txt» можно создавать через описатели;
2) получение пути по которому была запущена программа (первая строка в файле «Dir.Txt») можно осуществить, используя окружение DOS. Для этого, во-первых, необходимо получить адрес PSP (функция 062H прерывания 21H), во-вторых, найти в нем адрес окружения DOS. В-третьих, получив из окружения DOS строку, содержащую путь и имя за-пущенного файла, выделить из нее путь к текущему каталогу;
3) на следующем этапе производится поиск первого совпадающего с маской «*.*» файла и его имя записывается в файл «Dir.Txt». Перед на-чалом поиска необходимо правильно установить атрибут файла в CX для сравнения. Далее производится поиск следующего совпадающего с маской файла, используя функцию 04FH прерывания 21H. Если такой файл най-ден, то его имя записывается в «Dir.Txt», иначе осуществляется выход из программы;
4) перед загрузкой нового вектора прерывания необходимо сохранить старый вектор (функция 35h прерывания 21h);
5) новый обработчик прерывания должен быть FAR-процедурой;
6) для проверки, новая процедура обработки прерывания 05h должна выводить в динамик сигнал (прерывание 21H). В основной программе не-обходимо организовать большой цикл, например, выводящий на экран символы (прерывание 21h использовать нельзя, можно использовать, на-пример, прерывание 10h). Таким образом, при нажатии на PrintScreen во время этого цикла компьютер должен издавать сигнал.

Файл fandp.asm
.model tiny
.186
.code
;благодаря этой директиве мы сразу имеем адрес окружения! :) удобно! :)
org 2Ch
okr dw ?
org 100h
start:
;так можно загрузить сегм. регистр! :)
push okr
pop es
;начали искать строку с именем в окружении DOS
xor ax,ax
xor di,di
cld
met:scasb
jne d
cmp es:[di+1],byte ptr 0
je quit
d:jmp met
quit:add di,2
xor si,si
ms:mov al,byte ptr es:[di]
cmp al,0
je poka
mov path[si],byte ptr al
inc si
inc di
jmp ms
;закончили сканировать окружение в поисках пути
;перехватываем прерывание
poka:sub si,9
mov ax,3505h
int 21h
mov word ptr oldint, bx
mov word ptr oldint+2,es
mov ax,2505h
mov dx,offset inter
int 21h
;выдаем писк! :) а то принт скрин всё равно нажать не успеем! :)
int 5h
mov ah,0h
int 16h
lea dx,mesg
mov ah,9
int 21h
;открываем файл
call openfile
mov handle,ax
mov ah,40h
mov bx,handle
mov cx,si
lea dx,path
int 21h
mov ah,40h
mov bx,handle
mov cx,2
lea dx,crlf
int 21h
;установить адрес dta
mov ah,01ah
lea dx,fdta
int 21h
;начать поиск файлов
mov ah,4eh
lea dx,maska
mov cx,10h
int 21h
jc exit
mov di,0
mov cx,14
m0:cmp fname[di],’0′
je h0
inc di
h0:loop m0
mov ah,40h
mov bx,handle
mov cx,di
lea dx,fname
int 21h
mov ah,40h
mov bx,handle
mov cx,2
lea dx,crlf
int 21h
next:mov ah,4fh
mov cx,10h
lea dx,maska
int 21h
jc exit
mov di,0
mov cx,14
m2:cmp fname[di],’0′
je h1
inc di
h1:loop m2
mov ah,40h
mov bx,handle
mov cx,di
lea dx,fname
int 21h
mov ah,40h
mov bx,handle
mov cx,2
lea dx,crlf
int 21h
xor ax,ax
mov di,0
mov cx,14
m1:mov fname[di],al
inc di
loop m1
jmp next
exit: mov ah,3eh
mov bx,handle
int 21h
;восстанавливаем вектор обратно
mov ax,2505h
mov dx,word ptr oldint+2
mov ds,dx
mov dx,word ptr cs:oldint
int 21h
ret
;процедура обработки прерывания
inter proc far
pusha
push es
push ds
mov dl,07
mov ah,02
int 21h
pop ds
pop es
popa
jmp cs:oldint
inter endp
;процедура открытия файла
openfile proc near
mov ah,3ch
mov cx,0
mov dx,offset buf
int 21h
jnc nerr
mov dx,offset myerr
mov ah,9
int 21h
;перевод строки
mov dx,offset crlf
mov ah,09h
int 21h
nerr: ret
openfile endp
;.
oldint dd ?
mesg db «Find files$»
crlf db 0Dh,0Ah,’$’
buf db «filedir»,0
myerr db «WARNING.
File not create$»
handle dw ?
maska db «*.*»,0
fdta db 15h dup (?)
fattr db ?
ftime dw ?
fdata dw ?
fsize dd ?
fname db 14 dup (‘0’)
path db 256 dup (?)
end start

Компиляция :
c:\specprog\tasm\bin\tasm.exe /m fandp.asm
c:\specprog\tasm\bin\tlink.exe fandp.obj /t/x

Вот что имеем в результате запуска:
(под эмулятором и на реальном DOS при запуске вы услышите «писк»)
список найденых файлов сохраняется в файле filedir

Всё о клавише Fn на ноутбуке

Fn расшифровывается как функциональная кнопка (Function). На ноутбуке или нетбуке Вы можете увидеть, что данная кнопка немного отличается по цвету от других клавиш. Существует несколько клавиш на клавиатуре, которые имеют другой цвет — это кнопки быстрого доступа. Например, вместе с клавишей Fn и другой кнопкой быстрого доступа, вы с легкостью сможете активировать музыкальный проигрыватель или же отрегулировать громкость. Можно даже перевести компьютер в режим сна.

Где находится клавиша Fn?

Кнопка Fn почти во всех современных ноутбуках расположена одинаково. На некоторых моделях ноутбуков клавиша Фн находится слева от контрольной клавиши Ctrl, во всех остальных случаях Fn находится по правую сторону от Ctrl. Такое расположение присуще таким популярным моделям, как НР, Asus, Lenovo и т.д.

Сочетание клавиш с Fn

Комбинации клавиш вместе с кнопкой Fn на разных моделях ноутбуков немного отличаются, но в целом сочетания одинаковы. Я расскажу комбинации клавиш на примере ноутбука Lenovo. Вот что мы получим, если будем удерживать функциональную кнопку Fn и любую другую клавишу быстрого доступа:

  • Fn+F1 — Активируется режим сна в ноутбуке.
  • Fn+F2 — Включается или отключается экран.
  • Fn+F3 — переключение экрана в режим проектора.
  • Fn+F4 — Дополнительные возможности монитора.
  • Fn+F5 — Включение или отключение Bluetooth и других сетевых модулей.
  • Fn+F6 — Деактивировать сенсорный ввод на ноутбуке.
  • Fn+F9, Fn+F10, Fn+F11, Fn+F12 — Управление видеопроигрывателем.
  • Fn+Home — Пауза в музыкальном проигрывателе.
  • Fn+Insert — Активация или деактивация Scroll Lock.
  • Fn+вверх/вниз — Настройка яркости монитора.
  • Fn+влево/вправо — регулировка общей громкости ноутбука.

Знание всех этих простых комбинаций позволит вам значительно сэкономить время и появится возможность без усилий управлять компьютером, без мыши.

Как включить и отключить Fn

Существует несколько известных способов, связанных с отключением кнопки Fn. Один из самых простых способов деактивации Fn заключается в одновременном нажатии двух клавиш Fn+NumLock. Если нажать снова, то кнопка активируется.

Второй способ рекомендуется использовать, только если не получается с первым. Заходим в Биос, потом в Setup Utility, далее выбираем System Configuration, потом следуем во вкладку Action Keys Mode. В данной вкладке можно включать или отключать клавишу Fn.

Что делать, если не работает клавиша Fn?

Если вышепредставленные варианты не функционируют или Fn просто не работает, то нужно прибегнуть к специальным программам. В интернете можно найти уйму таких утилит, главное — знать свою марку ноутбука. Вот небольшой список таких программ:

  • Для Samsung — Easy Display Manager. Программа бесплатная в интернете.
  • Для Sony — Sony Shared Library, Setting Utility Series, Vaio Event Service, Vaio Control Center. Все эти программы можно найти на официальном сайте компании.
  • Для Toshiba — Hotkey Utility, Value Added Package, Flash Cards Support Utility.

Для некоторых моделей может подойти программа Magic Keyboard.

Необходимые драйвера для Fn кнопки

Если кнопка все равно не заработала, то нужно убедиться в том, что у вас правильно отрегулированы драйвера для Fn. В основном все драйвера должны идти в комплекте к ноутбуку, если их все-таки нет, то поиск в интернете поможет вам. Драйвера для данной клавиши лучше всего загружать с официальных сайтов, так надежнее.

Компьютерная грамотность с Надеждой

Заполняем пробелы – расширяем горизонты!

    CompGramotnost.ru » Клавиатура, мышь » О некоторых секретах функциональных клавиш на ноутбуке

О некоторых секретах функциональных клавиш на ноутбуке

В рамках компьютерной грамотности поговорим о специальных функциональных клавишах на ноутбуке. С их помощью можно легко и быстро управлять ноутбуком.

Функциональные клавиши F1-F12 на ноутбуке, позволяют, например:

  • подключать и отключать встроенную в ноутбук мышку (Tach-Pad),
  • включать и выключать приемник сигналов Wi-Fi,
  • подключать и отключать внешний монитор или проектор,
  • регулировать яркость экрана встроенного дисплея,
  • регулировать звук, отключать звук
  • и т.п.

Рис. 1. Особенности функциональных клавиш ноутбука

Функциональные клавиши ноутбука F1-F12

На рисунке 1 клавиша Fn на ноутбуке выделена красным прямоугольником (слева), а функциональные клавиши на ноутбуке, работающие совместно с клавишей Fn, выделены зелеными прямоугольниками.

Надписи, нанесенные на специальные функциональные клавиши, о которых идет речь, как правило, имеют свой цвет (точнее, свой дизайн) на встроенной клавиатуре, например, красный, синий, зеленый (или могут быть просто обведены белой рамкой). Тот же цвет (или дизайн) имеет надпись “Fn” на клавише “Fn” на ноутбуке. Это означает, что эти специальные клавиши работают, только если их нажимать одновременно с клавишей “Fn”.

Например, если на клавише “F1” нанесен красный (синий, зеленый) значок перечеркнутой встроенной мышки (что означает “отключение встроенной мышки” Tach-Pad для ноутбука Sony), то для отключения встроенной мышки нужно нажать на клавишу “Fn” на ноутбуке, и, удерживая ее нажатой, одновременно нажать на клавишу “F1”. Обратное подключение встроенной мышки делается аналогичным образом: “Fn” – “F1”.

На разных ноутбуках клавиши “F1” – “F12” имеют разные значения. Никакой стандартизации здесь не применяют.

  • На одном ноутбуке “F1” может означать отключение встроенной мышки, а на другом, например, отключение ПК в спящий режим (значок с дважды или трижды повторяющимся символом “Z”, что по мнению производителей ноутбуков означает звук “Z-z-z-z…”, по-русски это звучит “З-з-з-з…” и напоминает дыхание во время сна).

  • Клавиша, отвечающая за подключение и отключение Wi-Fi, имеет, как правило, изображение антенны, излучающей во все стороны сигнал.
  • Клавиша увеличения яркости изображения на встроенном дисплее имеет стилизованное изображение экрана (рамочка), внутри которого изображен крупный значок солнца.
  • А на клавише уменьшения яркости экрана изображение солнышка внутри стилизованного изображения экрана – маленькое.

Почти все изображения, нанесенные на клавиши “F1” – “F12” понятны без дополнительных объяснений. А в случае необходимости не стоит пренебрегать инструкциями, прилагаемыми ко всем без исключения ноутбукам. Эти инструкции существуют как в печатном виде (хорошо, если они написаны на русском языке, а то иногда бывает все что угодно, кроме русского языка), так и в виде .pdf файлов на ПК, размещенных в специальной папке на диске C: (тоже не всегда, к сожалению, эти описания сделаны на русском языке).

Подобная схема управления ноутбуком с помощью функциональных клавиш весьма удобна. Без них нужно было бы для каждого подключения – отключения или для каждой регулировки вызывать специальные программы. Причем, не все эти программы можно найти в “Панели управления”.

Иногда специфические программы (например, регулировка подсветки встроенной клавиатуры или управление зарядом батареи с целью обеспечения более продолжительной ее работы) не размещаются в “Панели управления”. Их тогда нужно находить среди специальных программ управления ноутбуком. И их нужно знать.

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

Эти настройки, как, например:

  • регулировка подсветки клавиатуры,
  • управление системой сбережения ресурса батареи,
  • специальные возможности для пользователей с ограниченными возможностями и т.п.)

не могут быть выполнены стандартными программами из “Панели управления” Windows.

Что нужно, чтобы работали функциональные клавиши на ноутбуке?

Важно понимать, что управление ноутбуком с помощью функциональных клавиш “F1” – “F12” делается с помощью специальных программ, которые производители ноутбука зашили в родную операционную систему ноутбука. Функциональные клавиши упрощают доступ к этим программам, делают эти программы как бы невидимыми для пользователя ноутбука.

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

А это означает, что если этих специальных программ не будет в ноутбуке, то работать функциональные клавиши не будут. И настройки делаться не будут! Еще одно подтверждение того факта, что компьютер – это единство работающего софта (т.е. программ) и работающего железа.

Почему перестали работать функциональные клавиши на ноутбуке?

Как могут исчезнуть программы, отвечающие за функциональные клавиши?

Различным образом. Например, можно переустановить систему в ноутбуке, но установить при этом не “родную” систему, а другую. Предположим, на купленном ноутбуке была система Windows XP. А захотелось установить Windows 7. Устанавливаем, получаем Windows 7, в которой нет специальных программ управления ноутбуком. И тогда функциональные клавиши ноутбука работать не будут.

Можно случайно или целенаправленно удалить специальные программы управления ноутбуком. Иногда они бывают как бы подгружены в операционной системе, так как могут предварительно запускаться при загрузке ПК. Оптимизируя загрузку ПК, отключая при загрузке “ненужные” (с точки зрения пользователя, оптимизирующего работу ПК) программы, можно случайно отключить “нужные” программы управления ноутбуком. Вот, кстати, одна из причин, по которой я не люблю оптимизацию загрузки, часто рекламируемую некоторыми продвинутыми пользователями.

Специальные программы могут быть уничтожены в результате воздействия вирусов. Возможны и другие способы лишиться специальных программ управления ноутбуком.

Как восстановить нормальную работу функциональных клавиш?

Обратное восстановление возможно, если есть “родной” дистрибутив системы, поставляемый вместе с ноутбуком. Или путем скачивания “родных” программ из Интернета, если они есть на сайтах производителей ноутбуков. Последнее особенно полезно, если пользователь ПК меняет версию операционной системы (как в вышеописанном примере замены Windows XP на Windows 7), но при этом НЕ использует “родную” операционную систему, прилагаемую к ноутбуку.

Специальные программы управления ноутбуком могут требовать периодических обновлений. Обновления специального программного обеспечения ноутбука не могут быть сделаны стандартным образом, используя сервис обновлений от Windows. Для обновления специального программного обеспечения ноутбука нужно иметь тоже специальную программу проверки и установки обновлений.

Работает эта программа, используя доступ к обновлениям через Интернет. Ее надо периодически запускать (если она не запускается автоматически при каждой загрузке Windows) и с ее помощью проверять обновления и устанавливать их. Если программа позволяет, то полезно установить автоматический режим поиска и установки обновлений специального программного обеспечения для управления ноутбуком.

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

Подводя итог, можно сказать, что управление ноутбуком с помощью функциональных клавиш и специальных программ, с которыми эти функциональные клавиши “связаны”, – весьма удобный сервис от производителей ноутбуков. Спасибо им за это! А сохранность этого сервиса – задача и ответственность пользователя ноутбука.

Надо следить за тем, чтобы система на ноутбуке была “родная”, чтобы все специальные программы присутствовали в ПК. И чтобы они “правильно” загружались при включении ПК. А также обязательно “правильно” обновлялись в течение всего периода эксплуатации ноутбука.

И тогда работать с ноутбуком будет приятно и удобно, как и было задумано их производителями.

Как набрать цифровые коды на ноутбуке

Цифровые коды не имеют непосредственного отношения к функциональным клавишам ноутбука F1-F12, тем не менее, для ноутбука существует проблема со вводом кодов, поэтому перейдем к ее рассмотрению и решению.

Вопрос читателя: При наборе текста я пользуюсь для набора знаков, отсутствующих на клавиатуре, цифровыми кодами через Alt: Alt+0151 — тире (не дефис), Alt+0171 и Alt+0187 — угловые типографские кавычки, что необходимо при наборе типографского текста. Как набрать эти коды на ноутбуке?

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

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

Рис. 2. Полно-размерная клавиатура (без клавиши FN). Кликните по рис. для его увеличения

Бывают, конечно, и ноутбуки с полно-размерной клавиатурой (как на рис. 2, кликните по рисунку для увеличения). Как правило, у них большой экран, но при этом у такого ноутбука солидные размеры и весит он немало. Среди обычных пользователей такие ноутбуки встречаются редко. Обратите внимание на рис. 2, что при полно-размерной клавиатуре у ноутбука нет клавиши Fn, она отсутствует за ненадобностью.

А как быть пользователям обычных ноутбуков, на клавиатуре у которых нет малой цифровой клавиатуры, а нужны функции малой цифровой клавиатуры, в частности, ввод цифровых кодов? Производители ноутбуков “выкрутились” тем, что зашили дополнительные возможности в другие клавиши ноутбука. Чтобы включить такие возможности, на ноутбуке есть вспомогательная клавиша Fn (выделена на рис. 1 и есть на рис. 3).

Как видно на рис. 3 (кликните по рис. для его увеличения), у каждой клавиатуры ноутбука есть цифровой ряд клавиш от 1 до 9. Они находятся во втором ряду, а в первом ряду – функциональные клавиши F1-F12. Нас будут интересовать другие цифры, которые имеются на ноутбуках и написаны более мелко, чем обычные цифры (выделены на рис. 3).

Рис. 3 (кликните по рис. для его увеличения). Выделены клавиши для работы малой цифровой клавиатуры NumLock и FN, а также маленькие цифры от 1 до 9 для ввода цифровых кодов

Чтобы набрать цифровой код на ноутбуке:

1) найдите клавиши Fn и Num Lock (на рис. 3 выделены красной рамкой, они оформлены в одном стиле – синим цветом и курсивом, но на вашем ноутбуке стиль может быть другим). Одновременно нажмите на клавиши Fn и Num Lock.

При этом на ноутбуке может загореться мини-лампочка, если такая индикация предусмотрена в ноутбуке. Таким образом Вы включите малую цифру клавиатуру, которую производители ноутбука “зашили” в обычную клавиатуру.

2) Обратите внимание на цифры от 0 до 9, которые имеют такой же цвет (тот же стиль), что и клавиша Fn. На каждом ноутбуке стиль оформления символов с малой цифровой клавиатуры будет своим, здесь нет стандартов.

На рис. 3 (кликабелен) малая цифровая клавиатура “зашита” (находится) на следующих клавишах ноутбука:

  • маленькая цифра 0 расположена на букве M,
  • маленькая цифра 1 на букве J,
  • маленькая цифра 2 на букве K,
  • маленькая цифра 3 на букве L,
  • маленькая цифра 4 на букве U,
  • маленькая цифра 5 на букве I,
  • маленькая цифра 6 на букве O,
  • маленькая цифра 7 на большой цифре 7,
  • маленькая цифра 8 на большой цифре 8,
  • маленькая цифра 9 на большой цифре 9.

Попробуйте на своем ноутбуке ввод цифр от 0 до 9 с малой цифровой клавиатуры в текстовом редакторе, например, в Блокноте.

3) Итак, клавиши Fn и Num Lock нажаты – малая цифровая клавиатура включена. Цифры с нее можно использовать как цифровые коды. Для ввода, например, кода Alt+0151,

  • жмем на клавишу Alt и, НЕ отпуская ее, вводим код 0151.
  • То есть, удерживая нажатой клавишу ALT, жмем поочередно на цифры: сначала на цифру 0 (там, где буква M на рис. 3). Затем, не отпуская ALT, нажимаем на 1 (там, где буква J), потом на 5 (там, где буква I) и снова на 1 (там, где буква J).
  • Отпускаем все клавиши должно появиться тире.
  • Если с первого раза не получилось, пробуем еще несколько раз.


4) Если больше не нужна малая цифровая клавиатура, одновременно нажмите на клавиши Fn и Num Lock. Тем самым будут выключены на клавиатуре дополнительные функции (то есть, будет выключена малая цифровая клавиатура).

И можно будет использовать клавиатуру в обычном режиме для ввода букв.

Как быть, если не работает малая цифровая клавиатура на ноутбуке? Думаю, что такое может быть, если

  1. не включена клавиша Num Lock или что-то иначе неправильно сделано. Обычно бывает при первых попытках научиться пользоваться малой клавиатурой.
  2. На ноутбуке была переустановлена родная операционная система, зашитая производителем, на неродную.

Вопросы читателей

Вот несколько вопросов от читателей блога с моими ответами, которые послужили материалом для написания этой статьи (кстати, задавайте вопросы в комментариях, если не найдете ответа на них, я отвечу, а мой ответ придет к Вам на электронную почту, на ваш E-mail).

Вопрос 1: Пока я работаю на клавиатуре, то если не увижу, стрелка курсора сама куда-то убегает. Есть какие-нибудь команды для недопущения этого?

Ответ: Курсор убегает на ноутбуке, если случайно и незаметно для себя задеть тачпад – это встроенная мышь ноутбука. Я тачпад отключаю по этой причине и пользуюсь обычной мышкой. У меня для того, чтобы отключить тачпад, есть клавиши + (сначала нажимаю , затем не отпуская ее, нажимаю ), у Вас могут быть другие сочетания клавиш. Посмотрите инструкцию для своего ноутбука (в бумажном или электронном виде), там про это написано.

Вопрос 2: Ноутбук, стоит Windows 7. Такая беда случилась: в правом нижнем углу экрана писалось раньше caps lock off или caps lock on (дублируя индикатор), а сейчас не пишет, индикатор при этом работает, но на него смотреть не очень удобно (особенно в хорошо освещённом помещении) включен режим caps lock или выключен.
Что могло сбиться в насторойках, и что можно сделать, чтобы вернуть текстовое уведомление о состоянии режима caps lock? Спасибо.

Ответ: Вероятнее всего, что это специфические настройки Вашего ноутбука. Я знаю, например, ноутбуки, у которых клавиатура имеет подсветку, и она (ее яркость, длительность свечения и пр.) настраивается отдельной специальной программой, входящей в комплект программного обеспечения ноутбука.

Если, например, переустановить Windows, и поставить не «родную» систему, которая поставлялась вместе с ноутбуков, то такие специфические программы исчезают напрочь, а вместе с ними исчезают привычные удобства.

Если Вы не переустанавливали операционную систему, то поищите в Панели управления или среди специальных программ управления Вашим ноутбуком программу, которая настраивает этот ставший привычным для Вас сервис.

Вопрос 3: Подскажите, пожалуйста: у меня на ноутбуке не загораются при нажатии индикаторы CAPS LOCK и NUM LOCK. Что делать? Как исправить ситуацию?

Одна из возможных причин — неродное программное обеспечение на ноутбуке, то есть родная операционная система была удалена, а взамен поставлена чужая операционная система для вашего ноутбука.

Статья закончилась, но можно еще прочитать:

2 Клавиатура

В этом разделе мы подробно рассмотрим одно из важнейших устройств персонального компьютера — клавиатуру. Практически ни одна программа не обходится без обращения к клавиатуре.

Программа может использовать клавиатуру по-разному. Она может задерживать свое выполнение до тех пор, пока пользователь не введет какое-нибудь число или пока не нажмет какую-нибудь клавишу. Выполняя некоторую работу, программа может периодически проверять, была ли нажата клавиша, изменяющая режим работы программы. Резидентные программы могут активизироваться, когда пользователь нажимает заранее определенную комбинацию. Можно использовать прерывание, вырабатываемое клавиатурой, например, для завершения работы программы.

Мы расскажем о работе с клавиатурой в среде MS-DOS на разных уровнях — от использования клавиатурных портов ввода/вывода до средств, предоставляемых стандартными библиотеками трансляторов C. Какой уровень вам следует выбрать, зависит от решаемой задачи. Единственное, что можно порекомендовать — это использовать по возможности средства высокого уровня. Если ваша программа обращается к клавиатуре через порты ввода/вывода, ее работоспособность может оказаться зависимой от типа клавиатуры и от модели компьютера.

Что же касается методики работы с клавиатурой в операционных системах Microsoft Windows, то она была описана в 11 томе «Библиотеки системного программиста», который называется «Операционная система Microsoft Windows для программиста».

Как работает клавиатура

Клавиатура выполнена, как правило, в виде отдельного устройства, подключаемого к компьютеру тонким кабелем. Малогабаритные блокнотные компьютеры содержат встроенную клавиатуру.

Что же находится внутри клавиатуры?

Оказывается, там есть компьютер! Только этот компьютер состоит из одной микросхемы и выполняет специализированные функции. Когда вы нажимаете на клавиши, он посылает номер нажатой клавиши в центральный компьютер.

Клавиатурная матрица

Если рассмотреть сильно упрощенную принципиальную схему клавиатуры, представленную на рисунке, можно заметить, что все клавиши находятся в узлах матрицы (рис. 2.1).

Рис.2.1. Упрощенная схема клавиатуры

Все горизонтальные линии матрицы подключены через резисторы к источнику питания +5 В. Клавиатурный компьютер имеет два порта — выходной и входной. Входной порт подключен к горизонтальным линиям матрицы (X0-X4), а выходной — к вертикальным (Y0-Y5).

Устанавливая по очереди на каждой из вертикальных линий уровень напряжения, соответствующий логическому нулю, клавиатурный компьютер опрашивает состояние горизонтальных линий. Если ни одна клавиша не нажата, уровень напряжения на всех горизонтальных линиях соответствует логической единице (так как все эти линии подключены к источнику питания +5 В через резисторы).

Если вы нажмете на какую-либо клавишу, то соответствующая вертикальная и горизонтальная линии окажутся замкнутыми. Когда на этой вертикальной линии процессор установит значение логического нуля, то уровень напряжения на горизонтальной линии также будет соответствовать логическому нулю.

Как только на одной из горизонтальных линий появится уровень логического нуля, клавиатурный процессор фиксирует нажатие на клавишу. Он посылает в центральный компьютер запрос на прерывание и номер клавиши в матрице. Аналогичные действия выполняются и тогда, когда вы отпускаете нажатую ранее клавишу.

Скан-код клавиши

Номер клавиши, посылаемый клавиатурным процессором, однозначно зависит от схемы клавиатурной матрицы, но не от обозначений, нанесенных на поверхность клавиш. Этот номер называется скан-кодом (Scan Code). Слово scan («сканирование»), подчеркивает тот факт, что клавиатурный компьютер сканирует клавиатуру для поиска нажатой клавиши.

Код ASCII нажатой клавиши

Обычно программе нужен не порядковый номер нажатой клавиши, а код, соответствующий обозначению на этой клавише (код ASCII).

Код ASCII не связан напрямую со скан-кодом, так как одной и той же клавише могут соответствовать несколько значений кода ASCII в зависимости от состояния других клавиш. Например, клавиша с обозначением «1» используется еще и для ввода символа «!» (если она была нажата вместе с клавишей ).

Поэтому все преобразования скан-кода в код ASCII выполняются программно. Как правило, в операционной системе MS-DOS эти преобразования выполняют модули BIOS. Для использования символов кириллицы эти модули расширяются клавиатурными драйверами, как входящими в состав локализованных версий MS-DOS, так и созданными в виде отдельных программ.

Режим автоповтора

Если нажать на клавишу и не отпускать ее, клавиатура перейдет в режим автоповтора. При этом в компьютер автоматически через некоторый период времени, называемый периодом автоповтора, посылается код нажатой клавиши. Режим автоповтора облегчает ввод с клавиатуры большого количества одинаковых символов.

Следует отметить, что клавиатура содержит внутренний 16-байтовый буфер, через который она осуществляет обмен данными с компьютером.

Типы клавиатур

До недавнего времени существовали три различных типа клавиатуры. Это клавиатура для компьютеров IBM PC/XT, 84-клавишная клавиатура для IBM PC/AT и 101-клавишная (расширенная) клавиатура для IBM PC/AT. Некоторые клавиатуры имеют переключатель режима работы (XT/AT), расположенный на нижней крышке. Он должен быть установлен в правильное положение.

После того как операционная система Microsoft Windows получила широкое распространение, специально для нее был создан новый тип клавиатуры. К обычной клавиатуре типа IBM PC/AT были добавлены две кнопки, первая из которых дублирует вызов меню Start, выполняемый при помощи левой клавиши мыши, а вторая – вызов того же меню при помощи правой клавиши мыши.

Порты для работы с клавиатурой

Назначение портов, предназначенных для работы с клавиатурой, зависят от типа компьютера.

Компьютер IBM PC/XT

Для работы с клавиатурой типа IBM PC/XT используются порты с адресами 60h и 61h.

Порт 60h доступен только для чтения. После выполнения этой операции он содержит скан-код последней нажатой клавиши.

Порт 61h доступен как для чтения, так и для записи. Он управляет не только клавиатурой, но и другими устройствами компьютера, например, работой встроенного динамика. Если в старший бит порта 61h записать значение 1, клавиатура будет заблокирована, если 0 — разблокирована.

Так как порт 61h управляет не только клавиатурой, при изменении содержимого старшего бита необходимо сохранить состояние остальных битов этого порта. Для этого можно сначала выполнить чтение содержимого порта в регистр, изменить состояние старшего бита, затем выполнить запись нового значения в порт:

Современные компьютеры

Современные компьютеры позволяют управлять скоростными характеристиками клавиатуры, а также зажигать или гасить светодиоды Scroll Lock, Num Lock и Caps Lock, расположенные на лицевой панели клавиатуры.

Для расширенного управления клавиатурой применяется порт 60h в режиме записи. Этот порт служит для управления подчиненным процессором Intel 8042, ответственным за обмен данными с клавиатурным компьютером, или его аналогом, установленным на системной плате компьютера.


При использовании порта 60h на запись программа дополнительно получает следующие возможности:

· установка времени ожидания перед переходом клавиатуры в режим автоповтора;

· установка периода генерации скан-кода в режиме автоповтора;

· управление светодиодами, расположенными на лицевой панели клавиатуры.

Процессор 8042 обслуживает не только клавиатуру, но и другие системы компьютера. Через порт 64h, например, выполняется сброс (отключение) процессора 80286 для возврата из защищенного режима работы в реальный. Подробности об этом вы можете узнать из 6 тома «Библиотеки системного программиста», который называется «Защищенный режим процессоров Intel 80286/80386/80486».

Перед тем как посылать команду процессору 8042, необходимо убедиться в том, что его внутренняя очередь команд пуста. Это можно сделать, прочитав слово состояния 8042 из порта с адресом 64h. Бит с номером 1 должен быть равен нулю.

Приведем фрагмент программы, составленной на языке ассемблера, проверяющий состояние очереди команд процессора 8042:

После того, как программа дождется готовности процессора 8042, она может послать ему команду, записав ее в порт с адресом 60h:

Некоторые команды состоят более чем из одного байта. Второй и следующие байты таких команд необходимо записывать в порт 60h, предварительно убедившись в готовности процессора 8042 с помощью приведенной выше последовательности команд. В большинстве случаев можно также использовать простую временную задержку:

Мы приведем формат двух команд процессора 8042, имеющих отношение к работе с клавиатурой — команду установки задержки и периода автоповтора и команду управления светодиодами, расположенными на клавиатуре.

Для установки характеристик режима автоповтора в порт 60h необходимо записать код команды 0F3h, затем байт, определяющий характеристики режима. Ниже вы найдете описание полей байта режима автоповтора:

Период автоповтора, который определяет количество посылок скан-кода, генерируемых процессором клавиатуры в одну секунду. Можно использовать не только те значения, которые приведены ниже, но и промежуточные, например, 9 или 15h.

Задержка включения режима автоповтора, mc:

Зарезервировано и должно быть равно нулю

Первоначально при инициализации системы BIOS устанавливает период задержки для включения режима автоповтора равным 500 мс при периоде автоповтора, равным 10 повторам в секунду. Если это слишком медленно для вас, вы можете установить другие значения.

Для управления светодиодами, расположенными на лицевой панели клавиатуры, используйте команду 0EDh. Вслед за этой командой в порт 60h необходимо записать байт, имеющий следующий формат:

1 – включить светодиод Scroll Lock;

0 – выключить светдиод Scroll Lock

1 – включить светодиод Num Lock;

0 – выключить светодиод Num Lock

1 – включить светодиод Caps Lock;

0 – включить светодиод Caps Lock

Программа KBDLED

Приведем пример простейшей программы KBDLED, управляющей светодиодами, расположенными на лицевой панели клавиатуры (листинг 2.1). Такое управление может выполняться только при использовании порта 60h, так как BIOS не содержит никаких подходящих для этого функций. Наша программа после запуска включит все светодиоды и будет ожидать, пока вы не нажмете любую клавишу. Затем программа выключит светодиоды.

Заметим, что программа KBDLED может не работать на виртуальной машине DOS, создаваемой, например, в операционной системе Microsoft Windows NT.

Листинг 2.1. Файл kbdled\kbdled.c

Аппаратное прерывание клавиатуры

Клавиатура подключена к линии прерывания IRQ1. Этой линии соответствует прерывание INT 09h.

Клавиатурное прерывание обслуживается BIOS, однако драйверы клавиатуры и резидентные программы могут организовывать дополнительную обработку прерывания INT 09h. Для этого может быть использована цепочка обработчиков прерывания.

Стандартный обработчик прерывания INT 09h

Как работает стандартный обработчик клавиатурного прерывания, входящий в состав BIOS?

Этот обработчик выполняет следующие действия:

· читает из порта 60h скан-код нажатой клавиши;

· записывает вычисленное по скан-коду значение кода ASCII нажатой клавиши в специальный буфер клавиатуры, расположенный в области данных BIOS;

· устанавливает в единицу бит 7 порта 61h, разрешая дальнейшую работу клавиатуры;

· возвращает этот бит в исходное состояние;

· записывает в порт 20h значение 20h для правильного завершения обработки аппаратного прерывания.

Обработчик прерывания INT 09h не просто записывает значение кода ASCII в буфер клавиатуры, но также выполняет и другие действия. Например, он дополнительно отслеживает нажатие пользователем таких комбинаций клавиш, как , обрабатывает специальные клавиши

и . При вычислении кода ASCII нажатой клавиши учитывается состояние клавиш и .

Буфер клавиатуры

Буфер клавиатуры имеет длину 32 байта и расположен в компьютере IBM PC/XT по адресу 0000h:041Eh.

В компьютерах моделей IBM PC/AT и IBM PS/2 расположение клавиатурного буфера задается содержимым двух слов памяти с адресами 0000h:0480h (смещение адреса начала буфера) и 0000h:0482h (смещение конца буфера). Обычно эти ячейки памяти содержат значения, соответственно, 001Eh и 003Eh. Так как смещения заданы относительно сегментного адреса 0040h, то стандартное расположение клавиатурного буфера в IBM PC/AT и IBM PS/2 соответствует его расположению в IBM PC/XT.

Буфер клавиатуры организован циклически. Это означает, что при его переполнении самые старые значения будут потеряны. Две ячейки памяти, находящиеся в области данных BIOS с адресами 0000h:041Ah и 0000h:041Ch содержат, соответственно, указатели на начало и конец буфера. Если значения этих указателей равны друг другу, буфер пуст.

Заметим, что вы можете удалить все символы из буфера клавиатуры, установив оба указателя на начало буфера. Однако есть более предпочтительный способ с использованием прерывания BIOS INT 16h, функции которого мы опишем позже в этой главе.

Указателями на начало и конец клавиатурного буфера обычно управляют обработчики прерываний INT 09h и INT 16h. Программа извлекает из буфера коды нажатых клавиш, используя различные функции прерывания INT 16h.

При переполнении внутреннего буфера клавиатуры или буфера, расположенного в области данных BIOS программа-обработчик прерывания INT 09h генерирует звуковой сигнал.

В программах MS-DOS у вас едва ли появится необходимость непосредственного манипулирования содержимым буфера клавиатуры — вы можете использовать прерывание BIOS INT 16h для выполнения практически всех клавиатурных операций.

Переключающие клавиши

Помимо управления содержимым буфера клавиатуры, обработчик прерывания INT 09h отслеживает так называемые переключающие клавиши — , , , . Состояние этих клавиш записывается в область данных BIOS в два байта с адресами 0000h:0417h и 0000h:0418h.

2. КЛАВИАТУРА

В этом разделе мы подробно рассмотрим одно из важнейших устройств персонального компьютера — клавиатуру. Практически ни одна программа не обходится без обращения к клавиатуре.

Программа может использовать клавиатуру по-разному. Она может задержать свое выполнение до тех пор, пока оператор не введет какое-нибудь число или пока не нажмет какую-нибудь клавишу. Выполняя некоторую работу, программа может периодически проверять, не нажал ли оператор на клавишу, изменяющую режим работы программы. Резидентные программы могут контролировать все нажатия на клавиши, активизируясь при нажатии определенной заранее комбинации. Можно использовать прерывание, вырабатываемое клавиатурой, например, для завершения работы программы.

Мы расскажем о работе с клавиатурой на разных уровнях — от использования клавиатурных портов ввода/вывода до средств, предоставляемых стандартными библиотеками трансляторов Microsoft QC 2.5 и C 6.0. Какой уровень вам следует выбрать, зависит от решаемой задачи. Единственное, что можно порекомендовать — это использовать по возможности средства высокого уровня. Если ваша программа работает с клавиатурой на уровне портов ввода/вывода, ее работа может оказаться зависимой от типа клавиатуры и от типа компьютера.


Клавиатура выполнена, как правило, в виде отдельного устройства, подключаемого к компьютеру тонким кабелем. Малогабаритные компьютеры Lap-Top используют встроенную клавиатуру.

Что же находится внутри клавиатуры? Оказывается, там есть компьютер! Только этот компьютер состоит из одной микросхемы и выполняет специализированные функции. Он отслеживает нажатия на клавиши и посылает номер нажатой клавиши в центральный компьютер.

Если рассмотреть сильно упрощенную принципиальную схему клавиатуры, представленную на рисунке, можно заметить, что все клавиши находятся в узлах матрицы:

Рис.1. Упрощенная схема клавиатуры

Все горизонтальные линии матрицы подключены через резисторы к источнику питания +5 В. Клавиатурный компьютер имеет два порта — выходной и входной. Входной порт подключен к горизонтальным линиям матрицы (X0-X4), а выходной — к вертикальным (Y0-Y5).

Устанавливая по очереди на каждой из вертикальных линий уровень напряжения, соответствующий логическому 0, клавиатурный компьютер опрашивает состояние горизонтальных линий. Если ни одна клавиша не нажата, уровень напряжения на всех горизонтальных линиях соответствует логической 1 (т.к. все эти линии подключены к источнику питания +5 В через резисторы).

Если оператор нажмет на какую-либо клавишу, то соответствующая вертикальная и горизонтальная линии окажутся замкнутыми. Когда на этой вертикальной линии процессор установит значение логического 0, то уровень напряжения на горизонтальной линии также будет соответствовать логическому 0.

Как только на одной из горизонтальных линий появится уровень логического 0, клавиатурный процессор фиксирует нажатие на клавишу. Он посылает в центральный компьютер запрос на прерывание и номер клавиши в матрице. Аналогичные действия выполняются и тогда, когда оператор отпускает нажатую ранее клавишу.

Номер клавиши, посылаемый клавиатурным процессором, однозначно связан с распайкой клавиатурной матрицы и не зависит напрямую от обозначений, нанесенных на поверхность клавиш. Этот номер называется скан-кодом (Scan Code).

Слово scan («сканирование»), подчеркивает тот факт, что клавиатурный компьютер сканирует клавиатуру для поиска нажатой клавиши.

Но программе нужен не порядковый номер нажатой клавиши, а соответствующий обозначению на этой клавише ASCII-код. Этот код не зависит однозначно от скан-кода, т.к. одной и той же клавише могут соответствовать несколько значений ASCII-кода. Это зависит от состояния других клавиш. Например, клавиша с обозначением ‘1’ используется еще и для ввода символа ‘!’ (если она нажата вместе с клавишей SHIFT).

Поэтому все преобразования скан-кода в ASCII-код выполняются программным обеспечением. Как правило, эти преобразования выполняют модули BIOS. Для использования символов кириллицы эти модули расширяются клавиатурными драйверами.

Если нажать на клавишу и не отпускать ее, клавиатура перейдет в режим автоповтора. В этом режиме в центральный компьютер автоматически через некоторый период времени, называемый периодом автоповтора, посылается код нажатой клавиши. Режим автоповтора облегчает ввод с клавиатуры большого количества одинаковых символов.

Следует отметить, что клавиатура содержит внутренний 16-байтовый буфер, через который она осуществляет обмен данными с компьютером.

В настоящее время существует три различных типа клавиатуры. Это клавиатура для компьютеров IBM PC/XT, 84-клавишная клавиатура для IBM AT и 101-клавишная (расширенная) клавиатура для IBM AT. Некоторые клавиатуры имеют переключатель режима работы (XT/AT), расположенный на нижней крышке. Он должен быть установлен в правильное положение.

Для работы с клавиатурой типа PC/XT используются порты с адресами 60h и 61h.

Порт 60h при чтении содержит скан-код последней нажатой клавиши.

Порт 61h управляет не только клавиатурой, но и другими устройствами компьютера, например, работой встроенного динамика. Этот порт доступен как для чтения, так и для записи. Для нас важен самый старший бит этого порта. Если в старший бит порта 61h записать значение 1, клавиатура будет заблокирована, если 0 — разблокирована.

Так как порт 61h управляет не только клавиатурой, при изменении содержимого старшего бита необходимо сохранить состояние остальных битов этого порта. Для этого можно сначала выполнить чтение содержимого порта в регистр, изменить состояние старшего бита, затем выполнить запись нового значения в порт:

Компьютер типа IBM AT позволяет управлять скоростными характеристиками клавиатуры, а также зажигать или гасить светодиоды на лицевой панели клавиатуры — Scroll Lock, Num Lock, Caps Lock.

Для расширенного управления клавиатурой используется порт 60h в режиме записи. Этот порт используются для управления подчиненным процессором Intel 8042, ответственным за обмен данными с клавиатурным компьютером.

При использовании порта 60h на запись программа дополнительно получает следующие возможности:

  • установка времени ожидания перед переходом клавиатуры в режим автоповтора;
  • установка периода генерации скан-кода в режиме автоповтора;
  • управление светодиодами, расположенными на лицевой панели клавиатуры — Scroll Lock, Num Lock, Caps Lock.

Процессор 8042 обслуживает не только клавиатуру, но и другие системы компьютера. Через порт 64h, например, выполняется сброс (отключение) процессора 80286 для возврата из защищенного режима работы в реальный.

Для посылки команды процессору 8042 вначале необходимо убедиться в том, что его внутренняя очередь команд пуста. Это можно сделать, прочитав слово состояния 8042 из порта с адресом 64h. Бит с номером 1 должен быть равен нулю.

Приведем фрагмент программы, составленной на языке ассемблера, проверяющий состояние очереди команд процессора 8042:

После того, как программа дождется готовности процессора 8042, она может послать ему команду, записав ее в порт с адресом 60h:

Некоторые команды состоят более чем из одного байта. Остальные байты команды необходимо записать в порт 60h, предварительно убедившись в готовности процессора 8042 с помощью последовательности команд, приведенной выше. В большинстве случаев можно также использовать простую временную задержку:

Мы приведем формат двух команд процессора 8042, имеющих отношение к работе с клавиатурой — команду установки задержки и периода автоповтора и команду управления светодиодами, расположенными на клавиатуре.

Для установки характеристик режима автоповтора в порт 60h необходимо записать код команды 0F3h, затем байт, определяющий характеристики режима:

Первоначально при инициализации системы период задержки для включения режима автоповтора устанавливается модулями BIOS равным 500 мс при периоде автоповтора, равном 10 повторам в секунду. Если это слишком медленно для вас, вы можете установить другие значения. Некоторые прикладные программы, например, текстовый процессор Microsoft Word, содержат средства для управления временными характеристиками клавиатуры.

Для управления светодиодами, расположенными на лицевой панели клавиатуры, используйте команду 0EDh. Вслед за этой командой в порт 60h необходимо записать байт, имеющий следующий формат:

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

Клавиатура подключена к линии прерывания IRQ1. Этой линии соответствует прерывание INT 09h.

Клавиатурное прерывание обслуживается модулями BIOS. Драйверы клавиатуры и резидентные программы могут организовывать дополнительную обработку прерывания INT 09h. Для этого может быть использована цепочка обработчиков прерывания. В первой книге первого тома мы приводили примеры расширения обработчика прерывания INT 09h.

Как работает стандартный обработчик клавиатурного прерывания, входящий в состав BIOS?

Этот обработчик выполняет следующие действия:

  • читает из порта 60h скан-код нажатой клавиши;
  • записывает вычисленное по скан-коду значение ASCII-кода нажатой клавиши в специальный буфер клавиатуры, расположенный в области данных BIOS;
  • устанавливает в 1 бит 7 порта 61h, разрешая дальнейшую работу клавиатуры;
  • возвращает этот бит в исходное состояние;
  • записывает в порт 20h значение 20h для правильного завершения обработки аппаратного прерывания.

Обработчик прерывания INT 09h не просто записывает значение ASCII-кода в буфер клавиатуры. Дополнительно отслеживаются нажатия таких комбинаций клавиш, как Ctrl-Alt-Del, обрабатываются специальные клавиши PrtSc и SysReq. При вычислении кода ASCII нажатой клавиши учитывается состояние клавиш Shift и CapsLock.

Буфер клавиатуры имеет длину 32 байта и расположен по адресу 0000h:041Eh для машин IBM PC/XT.

В IBM AT и PS/2 расположение клавиатурного буфера задается содержимым двух слов памяти с адресами 0000h:0480h (компонента смещения адреса начала буфера) и 0000h:0482h (смещение конца буфера). Обычно в IBM AT эти ячейки памяти содержат значения, соответственно, 001Eh и 003Eh. Так как смещения заданы относительно сегментного адреса 0040h, то видно, что обычное расположение клавиатурного буфера в IBM AT и PS/2 соответствует его расположению в IBM PC/XT.

Клавиатурный буфер организован циклически. Это означает, что при его переполнении самые старые значения будут потеряны. Две ячейки памяти, находящиеся в области данных BIOS с адресами 0000h:041Ah и 0000h:041Ch содержат, соответственно, указатели на начало и конец буфера. Если значения этих указателей равны друг другу, буфер пуст. (Можно удалить все символы из буфера клавиатуры, установив оба указателя на начало буфера. Однако есть более предпочтительный способ с использованием прерывания BIOS INT 16h).

Указателями на начало и конец клавиатурного буфера обычно управляют обработчики прерываний INT 09h и INT 16h.

Программа извлекает из буфера коды нажатых клавиш, используя различные функции прерывания INT 16h.

Помимо управления содержимым буфера клавиатуры, обработчик прерывания INT 09h отслеживает нажатия на так называемые переключающие клавиши — NumLock, ScrollLock, CapsLock, Ins. Состояние этих клавиш записывается в область данных BIOS в два байта с адресами 0000h:0417h и 0000h:0418h.

Формат байта 0000h:0417h:

Формат байта 0000h:0418h:

Если вы изменяете состояние светодиодов на панели клавиатуры, не забывайте устанавливать соответствующие биты в байтах состояния клавиатуры.

Программой обработки прерывания INT 09h отслеживаются некоторые комбинации клавиш. В таблице приведены эти комбинации и действия, выполняемые обработчиком прерывания при их обнаружении:

Многие типы клавиатур имеют отдельную альтернативную цифровую панель, напоминающую клавиатуру калькулятора. Если одновременно с нажатием на клавишу Alt набрать число на этой панели (не большее, чем 255 и не равное 0), то это число будет помещено в буфер клавиатуры, как будто бы оно было введено нажатием на одну клавишу. Это число будет также записано в слове по адресу 0000h:0419h в области данных BIOS.

При переполнении внутреннего буфера клавиатуры или буфера, расположенного в области данных BIOS, программа-обработчик прерывания INT 09h генерирует звуковой сигнал.

При составлении программ для MS-DOS у вас едва ли появится необходимость непосредственного манипулирования содержимым буфера клавиатуры — вы можете использовать прерывание BIOS INT 16h для выполнения практически всех клавиатурных операций.

В следующем разделе мы займемся непосредственно изучением средств работы с клавиатурой, предоставляемых в распоряжение прерыванием BIOS INT 16h.

Набор функций для работы с клавиатурой, предоставляемый в распоряжение программиста прерыванием BIOS INT 16h, включает в себя функции для выборки кода нажатого символа из буфера с ожиданием нажатия, функции для проверки содержимого буфера и для управления содержимым буфера, функции для изменения скоростных характеристик клавиатуры.


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

Приведем формат вызова функции:

Приведем таблицу скан-кодов для клавиатуры IBM PC/XT:

Для остальных клавиш функция 00h прерывания INT 16h возвращает расширенный ASCII-код:

В следующей таблице приведены скан-коды клавиш, имеющихся только на 101-клавишной клавиатуре:

Буква «Д» в последней таблице обозначает дополнительную («калькуляторную») клавиатуру.

Для демонстрации использования функции 00h прерывания INT 16h мы подготовили программу, выводящую на экран скан-коды и ASCII-коды нажимаемых клавиш:

Функция 01h поможет вам проверить состояние буфера клавиатуры — есть там коды нажатых клавиш или нет. При этом программа не переводится в состояние ожидания, даже если буфер клавиатуры пуст. В этом случае в регистре флагов устанавливается в единицу флаг ZF и управление возвращается программе.

Эту функцию удобно использовать во время выполнения какого-либо длительного процесса (например, форматирования диска или передачи данных по линии связи) для прерывания этого процесса по запросу оператора.

Кроме того, функцию можно использовать вместе с функцией 00h для сброса содержимого клавиатурного буфера. Для этого в цикле повторяют вызов функции 01h, вслед за которым идет вызов функции 00h при условии, что буфер клавиатуры не пуст. Сброс клавиатурного буфера полезно выполнять перед вводом ответственной информации, так как из-за случайного двойного или тройного нажатия на клавишу в буфере клавиатуры могут оказаться лишние символы.

Приведем текст программы, выводящей на экран в цикле символ ‘*’. При нажатии на любую клавишу, кроме ESC, программа выводит на экран строку текста — инструкцию для завершения работы программы. Если нажать на клавишу ESC, работа программы будет завершена.

Функция возвращает в регистре AL состояние переключающих клавиш (Shift, Ctrl, Alt, ScrollLock, NumLock, CapsLock, Ins). Формат байта состояния соответствует формату байта, находящегося в области данных BIOS по адресу 0000h:0417h:

Функция может быть использована для анализа текущего состояния переключающих клавиш.

Изменим текст предыдущей программы таким образом, чтобы завершение ее работы происходило лишь в том случае, если переключающая клавиша CapsLock находится в выключенном состоянии (соответствующий светодиод не горит):

Мы уже рассказывали о возможности изменения временных характеристик клавиатуры. Если BIOS, установленная в вашей машине, изготовлена после 15 декабря 1985 года, вы можете воспользоваться этой функцией для ускорения (или замедления) работы клавиатуры.

В качестве примера приведем две программы. Первая программа увеличивает быстродействие клавиатуры до его верхнего предела, вторая восстанавливает исходные значения временных характеристик.

С помощью этой функции можно вставить символы в буфер клавиатуры, как будто они были введены оператором.

Приведенная программа записывает в буфер клавиатуры пять символов ‘*’. Запустите ее и посмотрите на системное приглашение. Вы увидите что-нибудь похожее на C:>*****.

Функция 10h полностью аналогична функции 00h, но она предназначена для работы с клавиатурой, имеющей 101 клавишу.

Приведем формат вызова функции:

Функция определена для BIOS, изготовленной не раньше 15 декабря 1985 года.

Функция 11h полностью аналогична функции 01h, но она предназначена для работы с клавиатурой, имеющей 101 клавишу.

Эта функция определена для BIOS, изготовленной не раньше 15 декабря 1985 года.

Функция возвращает в регистре AL состояние переключающих клавиш (Shift, Ctrl, Alt, ScrollLock, NumLock, CapsLock, Ins):

Функция 12h аналогична функции 02h, но она предназначена для работы с клавиатурой, имеющей 101 клавишу и имеет другой формат байта состояния.

Эта функция определена для BIOS, изготовленной не раньше 15 декабря 1985 года.

К сожалению, MS-DOS не предоставляет программам каких-либо существенных дополнительных возможностей по сравнению с функциями прерывания BIOS INT 16h. Поэтому многие программы работают с клавиатурой через BIOS.

Однако, если ваша программа пользуется клавиатурными функциями MS-DOS, то ей доступно средство переназначения ввода операционной системы. Это возможно благодаря тому, что клавиатурные функции MS-DOS являются функциями, работающими со стандартным вводом MS-DOS, а стандартный ввод может быть переназначен.

Кроме того, некоторые клавиатурные функции автоматически посылают введенные символы на устройство стандартного вывода. По умолчанию это дисплей, но устройство стандартного вывода может быть переназначено для вывода в файл, на принтер или другое устройство.

Вообще говоря, клавиатурные функции MS-DOS больше всего подходят для тех программ, которые ведут с оператором «построчный» диалог. Для таких программ при использовании средств переназначения ввода/вывода возможна организация автоматического «пакетного» выполнения, когда все сообщения выводятся в файл, а все данные, которые обычно вводятся с клавиатуры, считываются из заранее подготовленного файла «ответов».

Некоторые клавиатурные функции MS-DOS отслеживают комбинации клавиш Ctrl-C и Ctrl-Break. Если оператор ввел такую комбинацию клавиш, вызывается прерывание INT 23h, завершающее работу текущей программы. Если ваша программа не должна завершаться при нажатии этих комбинаций клавиш, можно либо создать и подключить собственный обработчик для INT 23h, либо использовать те клавиатурные функции MS-DOS, которые не выполняют проверку указанных выше комбинаций клавиш.

Приведем подробное описание клавиатурных функций прерывания MS-DOS INT 21h.

Функция читает символы со стандартного устройства ввода. Если стандартным устройством ввода является клавиатура, и буфер клавиатуры пуст, выполнение программы задерживается до нажатия на любую клавишу.

Введенный символ выводится на стандартное устройство вывода.

Если программа в качестве ASCII-кода получила 0, она должна вызвать эту функцию еще один раз. Во второй раз регистр AL будет содержать расширенный ASCII-код нажатой клавиши.

Функция аналогична предыдущей. Она читает символы со стандартного устройства ввода. Если стандартным устройством ввода является клавиатура, и буфер клавиатуры пуст, выполнение программы задерживается до нажатия на любую клавишу.

Эту функцию необходимо использовать в тех случаях, когда не требуется автоматически дублировать на экране вводимые с клавиатуры символы. Например, с ее помощью можно организовать ввод паролей.

Если буфер клавиатуры пуст, выполнение программы задерживается до нажатия на любую клавишу.

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

Функция 06h может использоваться как для ввода с консоли, так и для вывода символов на консоль. Режим работы функции зависит от содержимого регистра DL при вызове функции. Если этот регистр содержит значение 0FFh, функция выполняет ввод с консоли, в противном случае символ, код которого записан в этот регистр, выводится на консоль.

Очевидно, что с помощью этой функции нельзя вывести на консоль символ с кодом 0FFh.

Основное отличие функции 06h от всех описанных ранее заключается в том, что эта функция не ожидает, пока оператор нажмет на клавишу. Если буфер клавиатуры пуст, функция просто устанавливает флаг процессора ZF в 1.

Если в буфере клавиатуры имеются символы, флаг ZF сбрасывается и в регистр AL функция записывает ASCII-код символа.

Функция предназначена для ввода с клавиатуры строки символов. Перед вызовом функции необходимо специальным образом подготовить буфер, адрес которого передается в регистрах DS:DX — в первый байт буфера следует записать максимальную длину вводимой строки (в диапазоне от 1 до 244):

После возврата из функции буфер будет иметь следующий формат:

Ввод осуществляется до тех пор, пока либо количество введенных символов не достигнет max-1, либо пока не будет нажата клавиша Enter (код 0Dh). Если оператор уже ввел max-1 символ и продолжает вводить символы дальше, функция выдает звуковой сигнал на каждое нажатие и игнорирует вводимые символы до тех пор, пока не будет нажата клавиша Enter.

При вводе строки можно использовать стандартные средства редактирования MS-DOS, используемые при вводе команд в режиме командной строки.

Эта функция проверяет состояние клавиатурного буфера. Вы можете вызывать ее перед функциями 01h, 07h, 08h для того, чтобы избежать ожидания нажатия на клавишу.

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

Функция очищает клавиатурный буфер, затем вызывает клавиатурную функцию MS-DOS, номер которой определяется содержимым регистра AL. Если же регистр AL содержит другое значение, кроме приведенных выше, функция просто сбрасывает содержимое буфера и не выполняет никаких других действий.

Эту функцию удобно использовать тогда, когда перед вводом символа необходимо убедиться в том, что буфер клавиатуры пуст.

Стандартные библиотеки трансляторов Microsoft QuickC и C 6.0 содержат набор функций, предназначенных для работы с клавиатурой. Эти функции повторяют и немного дополняют возможности функций MS-DOS и BIOS, обслуживающих клавиатуру.

Самые простые из них — getch() и getche(). Они описаны в файле conio.h.

Функция getch() имеет следующий прототип:

Эта функция возвращает ASCII-код прочитанного из клавиатурного буфера символа, причем прочитанный символ не отображается на экране. Если была нажата функциональная клавиша или клавиша перемещения курсора, функция возвращает 0. В этом случае функцию надо вызвать еще раз для получения расширенного ASCII-кода нажатой клавиши.

Функция обрабатывает клавиши Ctrl-С и Ctrl-Break — при вводе этих комбинаций клавиш работа программы завершается.

Если клавиатурный буфер пуст, программа переводится в состояние ожидания.

Функция getche() полностью аналогична функции getch(), за исключением того, что прочитанный символ отображается на экране. Приведем прототип функции getche():

Приведем пример программы, отображающей на экране ASCII-коды и расширенные ASCII-коды нажимаемых клавиш:

Для проверки буфера клавиатуры на наличие символов можно использовать функцию kbhit(). Она также описана в файле conio.h:

Если буфер клавиатуры не пуст, функция возвращает ненулевое значение. В этом случае программа может прочитать символы из буфера клавиатуры при помощи фукнкций getch() и getche(). Если буфер клавиатуры пуст, функция возвращает нулевое значение.

Приведем пример программы, ожидающей нажатия на любую клавишу. Во время ожидания программа выводит на экран поочередно символы » «:

Для ввода с клавиатуры строки символов можно использовать функцию cgets(), работающую аналогично функции 0Ah прерывания MS-DOS INT 21h:

Функция описана в файле conio.h.

Перед вызовом аргумент функции buffer должен указывать на массив, размер которого должен быть достаточным для хранения вводимой строки, завершающего строку нулевого байта и двух дополнительных байтов. Первый элемент массива buffer[0] должен содержать максимальную длину вводимой строки — как и для функции 0Ah прерывания MS-DOS INT 21h.

После завершения ввода второй элемент массива buffer[1] будет содержать длину введенной строки, сама строка будет завершаться символами новой строки NL, перевода строки LF и нулем.

Функция cgets() возвращает указатель на начало введенной строки в буфере, т.е. на третий элемент массива buffer[2].

Приведем простой пример, в котором функция cgets() используется для ввода целого числа:

Существует и более удобная для использования функция, позволяющая вводить строку с клавиатуры, а точнее, из стандартного потока ввода. Это функция gets():

Функция gets() описана в файле stdio.h.

Эта функция читает строку из стандартного потока ввода stdin и запоминает ее в буфере buffer. Символ новой строки n в конце введенной строки функция заменяет на ноль.

После завершения ввода функция возвращает указатель на заполненный буфер или NULL в случае ошибки или условия «Конец файла».

Обратим ваше внимание на отличия между функциями cgets() и gets():

  • Функция cgets() позволяет редактировать вводимую строку символов, функция gets() просто записывает в буфер все символы подряд (в том числе и коды клавиш редактирования).
  • Программе, использующей для ввода с клавиатуры функцию cgets(), недоступны средства переназначения ввода операционной системы. Если же программа использует функцию gets(), которая читает строку из стандартного потока ввода, можно использовать средства переназначения.
  • Перед вызовом функции cgets() необходимо специальным образом подготовить буфер для вводимой строки (записать в первый байт буфера длину вводимой строки). Функция gets() не требует никакой подготовки буфера.

Еще одна полезная функция, которую можно использовать для ввода с клавиатуры — scanf(). Эта функция подробно описана во всех книгах по языку программирования Си, поэтому мы не будем ее подробно рассматривать. Отметим только, что с помощью этой функции можно организовать ввод чисел в заданном формате. Однако можно сначала ввести строку при помощи функций cgets() или gets(), а уже потом выполнять все необходимые проверки и преобразования этой строки.

Илон Маск рекомендует:  Что такое код setusercharsize
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL