Открой свой мир программирования и    
цифровых технологий
Заключение и пример
Автор lisa   
19.07.2011 г.

Если вы находитесь в ситуации, когда приходится выбирать между службами для клавиатуры, предоставляемыми языком программирования, с которым вы работаете, и службами для клавиатуры, предоставляемыми ROM BIOS, то можете без боязни успешно использовать любые из них. Хотя в некоторых случаях имеется аргументация против непосредственного использования служб ROM BIOS , как в случае со службами для дискеты, однако данная аргументация теряет силу в отношении служб для клавиатуры. Тем не менее, как всегда, вам следует сперва в полном объеме испробовать потенциальные возможности служб DOS, прежде чем прибегнуть к помощи служб ROM BIOS; может оказаться, что все необходимое вы найдете среди служб DOS, и, кроме того, они более долговечны в постоянно изменяющемся мире персональных компьютеров.

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

Другим преимуществом использования служб системы DOS для клавиатуры является то, что службы DOS могут переадресовывать ввод с клавиатуры таким образом, что знаки будут считываться на самом деле не с клавиатуры, а из файла. Если же вы доверите выполнение работы с клавиатурой службам ROM BIOS, то вы уже не сможете переадресовывать клавиатурный ввод. (В гл.16 и 17 содержится информация о переадресации ввода /вывода.)

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

Программа работает, используя прерывание 16Н с функцией 01Н для проверки, является ли бу­ фер пустым. Если в буфере не имеется ни одного знака, служба 01Н устанавливает флаг нуля, и со­ответственно выполнение директивы JZ L02 приведет к выходу из программы, так как управление перейдет к команде с меткой L02. Однако если буфер по-прежнему будет содержать знаки, то служба 01Н очистит флаг нуля и перехода по директиве JZ L02 не произойдет. В этом случае прог­рамма продолжит свою работу и будет выполнять команды, обеспечивающие вызов службы ООН для чтения следующего знака из буфера. Затем этот процесс повторится, так как директива JMP L01 пе­редаст управление обратно на метку L01. Рано или поздно, естественно, благодаря повторным вызо­вам службы ООН буфер будет очищен, служба 01Н установит флаг нуля в единицу и программа завершит свою работу.

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

Директива ASSUME, приведенная в этом примере, говорит, ассемблеру о том, что метки, расположенные в сегменте с кодом (т.е. метки, которые обычно адресуются при помощи регистра CS), на самом деле лежат внутри сегмента с именем _ТЕХТ. Это выглядит довольно очевидным, так как другие сегменты не встречаются в этой программе.

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

 
« Пред.
Скачать книги по программированию