 |
Получение символов с клавиатуры
-----------------------------------------------------------------
Ввод информации с клавиатуры - один из основных способов
взаимодействия с компьютером IBM PC. DOS обеспечивает ряд функ-
ций, с помощью которых программа на ассемблере может обрабатывать
нажатия клавиш. Мы обсудим только часть из них.
Возможно одним из наиболее простых способов получения симво-
лов клавиш является функция "Ввод с клавиатуры", то есть функция
DOS номер 1. Функции DOS вызываются путем помещения номера функ-
ции в регистр AH и выполнения затем инструкции INT 21h. (Действи-
тельная работа инструкции INT несколько более сложна, но сейчас
вам требуется только знать, что каждый раз при вызове функции DOS
вы должны выполнять инструкцию INT 21h.) Следующий набранный на
клавиатуре символ возвращается в регистре AL.
Например, когда выполняется код:
.
.
.
mov ah,1
int 21h
.
.
.
операционная система DOS помещает следующий набранный на клавиа-
туре символ в регистр AL. Заметим, что если клавиша не нажата,
DOS будет ждать, когда она будет нажата, поэтому для выполнения
данной функции может потребоваться неопределенное время.
Вывод символов на экран
-----------------------------------------------------------------
Если нажатия клавиш означают взаимодействие пользователя с
программным обеспечением, то экран является дополнением. IBM PC
оснащаются дисплеями различных типов, начиная от цветного тексто-
вого до графического с высоким разрешением, но в данный момент мы
рассмотрим только вывод символов.
Функция DOS с номером 2 обеспечивает наиболее непосредствен-
ный путь вывода символа на экран. Для этого нужно просто помес-
тить 2 в регистр AH и выводимый символ в регистр DL, а затем вы-
звать DOS с помощью INT 21h. Следующий код отображает каждый вве-
денный символ на экране:
.
.
.
mov ah,1
int 21h ; получить код следующей нажа-
; той клавиши
mov ah,2
mov dl,al ; переместить считанный
; символ из AL в DL
int 21h ; вывести его на экран
.
.
.
Имеется также ряд других функций для считывания и вывода
символов и строк символов. Некоторые из них вы найдете в примерах
программ данного руководства. Поскольку для описания всех функций
DOS потребуется целая книга, мы не можем здесь рассказать обо
всех функциях. Однако мы настоятельно рекомендуем вам изучить
хотя бы некоторые из соответствующих книг и руководств и узнать о
функциях DOS поподробнее, поскольку они являются в программирова-
нии на Ассемблере ключевым ресурсом.
Есть еще одно замечание, которое нужно сделать относительно
клавиатуры, экрана и файлового ввода и вывода на языке Ассембле-
ра. Те из вас, кто пользовался функциями scanf и printf в языке
Си или функциями Readln n Writeln в Паскале, возможно с удивлени-
ем узнают, что в DOS не предусмотрено форматного ввода и вывода.
DOS выполняет только посимвольный или построчный ввод-вывод. В Си
для печати целой переменной вам требуется сделать следующее:
printf("\\d\n",i);
Си автоматически преобразует целое значение, которое хранит-
ся в 16-битовой ячейке памяти, в строку символов кода ASCII и пе-
чатает символы. В Ассемблере ваша программа должна явно преобра-
зовывать переменные в строки символов, перед тем, как вывести их
на экран. Аналогично, DOS знает только, как считывать символы и
строки символов с клавиатуры, поэтому вам придется писать прог-
раммы, преобразующие вводимые пользователем строки и символы в
другие данные.
В конце следующей главы мы покажем вам пример программы, ил-
люстрирующий все то, что вам нужно сделать, чтобы напечатать зна-
чение переменной. Сейчас запомните только, что функции DOS могут
печатать символы или строку символов, и ничего более. Функция по
преобразованию данных в символ, с которым может работать DOS,
возлагается на вас.
Вывод символов на экран
-----------------------------------------------------------------
Теперь, когда вы немного знаете о чтении и записи в програм-
ме, давайте напишем простую программу, которая выполняет просто
эхоотображение строки набранных на клавиатуре символов на экране.
Все необходимые для этого функции DOS, кроме одной, вы уже знае-
те. Эта последняя функция необходима, поскольку у вас нет способа
завершить программу, когда она закончит выполнение.
Те, кто знаком с языками Паскаль или Си, могут подумать, что
программа на Ассемблере просто закончит работу, когда она дойдет
до конца основной программы. Но это не так. Чтобы завершить свою
программу на Ассемблере, вы должны выполнить явный вызов функции
DOS.
Для завершения программы имеется несколько функций DOS, но
наиболее предпочтительным методом является выполнение функции DOS
с номером 4Ch (или 76 для тех, кто предпочитает десятичный вид).
Зная это, можно теперь написать полную программу отображения сим-
волов:
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
.CODE
EhcoLoop:
mov ah,1 ; функция DOS ввода с
; клавиатуры
int 21h ; получить следующую клавишу
cmp al,13 ; это клавиша ENTER?
jz EchoDone ; да, выполняем эхоотображение
mov dl,al ; поместить символ в DL
mov ah,2 ; функция DOS вывода на экран
int 21h ; вывести на экран символ
jnz EchoLoop ; отобразить следующий символ
EchoDone:
mov ah,4ch ; функция DOS завершения
; программы
int 21h ; завершить программу
END
Введите программу точно в таком виде и запустите ее. Вы уви-
дите, что каждый вводимый вами символ выведется дважды: один раз,
когда он отображается DOS при вводе с клавиатуры, и второй раз,
когда он отображается вашей программой. Важным моментом здесь яв-
ляется то, что все действия: считывания символов клавиш, вывод
символов на экран и завершение программы выполняются с помощью
функций DOS.
Базовая система ввода-вывода
-----------------------------------------------------------------
Иногда функции DOS не отвечают вашим потребностям. Тогда
настал момент обратиться к базовой системе ввода-вывода IBM PC -
BIOS. В отличие от DOS и прикладных программ BIOS не загружается
с диска и не занимает место в 640К доступной памяти. Вместо этого
BIOS хранится в памяти, доступной только по чтению (ROM или ПЗУ),
в той части адресного пространства процессора 8086, которое заре-
зервировано для системных функций.
BIOS является программным обеспечением IBM PC самого нижнего
уровня. Даже DOS использует для управления аппаратурой функции
BIOS. Лучше использовать функции BIOS, чем управлять аппаратными
средствами непосредственно, поскольку, аналогично DOS, BIOS поз-
воляет "скрыть" различия между различными компьютерами и устрой-
ствами. С другой стороны, там, где это возможно, вам следует
пользоваться функциями DOS, а не функциями BIOS, поскольку прог-
раммы, использующие BIOS, могут приводить к конфликту с другими
программами и в общем случае менее переносимы при работе на раз-
ных ЭВМ.
Выбор режима экрана
-----------------------------------------------------------------
Наиболее решающей причиной использования BIOS является уп-
равление дисплеем, так как DOS практически не предусматривает
поддержки широких возможностей дисплеев IBM PC. Только с помощью
вызова функций BIOS вы можете установить режим экрана, управлять
цветами, получить информацию о дисплейном адаптере и т.д. Напри-
мер, следующий код вызывает BIOS и устанавливает экран графичес-
кого адаптера CGA в четырехцветный графический режим:
.
.
.
mov ah,0 ; функция BIOS установки
; режима
mov al,4 ; номер режима для 4-цветной
; графики с разрешением 320х200
int 10h ; выполнить видеопрерывание
; BIOS для установки режима
.
.
.
Как вы наверное помните, мы уже говорили о том, что для
установки видеорежима необходимо более 30 инструкций OUT. Теперь
|