Ценность программы прямо пропорциональна
весу ее «выдачи».
Прикладная Мерфология
Функции MS DOS для работы с консолью сосредоточены в обработчике прерывания int 21h. Они представляют собой набор средств работы с консолью, занимающий промежуточное положение между программами пользователя и средствами BIOS. Для достижения большей эффективности некоторые из функций BIOS можно комбинировать с функциями MS DOS. Как пример такого полезного взаимодействия можно привести использование возможностей BIOS по работе с курсором. Как будет видно из приведенного ниже материала, среди функций MS DOS подобные средства отсутствуют. При выполнении конкретных практических заданий можно найти и другие полезные примеры взаимодействия.
Функции MS DOS для ввода данных с клавиатуры
Для ввода данных с клавиатуры можно использовать два вида
функций: универсальную функцию 3fh (ввод из файла) и группу
специализированных функций MS DOS ввода с клавиатуры.
Подробно использование функции 3fh для ввода данных
рассматривается в главе 7, а здесь сосредоточимся на второй группе
функций, в которую входит семь функций, отличающихся друг от друга
следующими характеристиками:
- ожиданием ввода при отсутствии символа в буфере клавиатуры или только проверкой буфера на наличие символов для ввода;
- количеством вводимых символов;
наличием эха при вводе, то есть дублированием вводимого с клавиатуры символа на экране; - восприимчивостью к сочетанию клавиш Ctrl+C (код 03h).
Чтение с эхом символа с клавиатуры (10h int 21h)
Функция 01h позволяет ввести один символ с клавиатуры.
Если символа нет, то функция ожидает его ввода. Вводимый символ
отображается на экране (эхо).
Вход: АН = 01h — чтение символа с эхом. "
Выход: AL = ASCII-код символа или 0.
На выходе функция помещает в регистр AL ASCII-код символа или 0.
Наличие нуля в регистре AL говорит о том, что в буфере клавиатуры
находится расширенный ASCII-код и необходимо повторить вызов функции с
тем, чтобы прочитать его второй байт. Также функция 01h проверяет
наличие в буфере символов нажатия комбинации Ctrl+C (Ctrl+Break), при
обнаружении которых производится вызов прерывания int 23h.
Для ввода нескольких символов данную функцию необходимо использовать в цикле.
:prg05_06.asm - программа ввода нескольких символов функцией 01h 21h
;.........
.data
string db 5 dup (0)
len_string =$-string
adr_string dd string
.code
......movcx.len_sthng
lesdi.adr_string ml: mov ah.01h
int 21h
cmpal.0 расширенный код???
jnem2
обрабатываем расширенный код
jmp m3
ni2: stosb .формируем строку символов
mЗ: loop ml
Проверяя работу программы, вместо ввода очередного символа введите комбинацию Ctrl+C и посмотрите реакцию программы.
Прямой ввод с эхом символа с клавиатуры (06h int 21h)
Функция 06h также позволяет ввести один символ с
клавиатуры. Но в отличие от функции 01h она не ожидает ввода при
отсутствии символа в буфере. Вводимый символ отображается на экране
(эхо).
Вход: АН = 06h — чтение символа с эхом без ожидания; DL = 0ffn —
признак того, что функция 06h используется для ввода; если DL <>
0ffn, то функция используется для вывода символа (см. ниже).
Выход: если ZF=O, то AL = ASCII-код символа; если ZF-1, то
символа в буфере нет. Результаты работы этой функции необходимо
оценивать прежде всего по значению флага ZF. Если ZF=O, то функция
поместила в регистр AL ASCII-код символа или 0. Наличие нуля в регистре
AL говорит о том, что в буфере клавиатуры находится расширенный
ASCII-код и необходимо повторить вызов функции с тем, чтобы прочитать
его второй байт. Функция 06h не проверяет наличие в буфере символов
нажатия комбинации Ctrl+C (Ctrl+Break).
Чтение без эха символа с клавиатуры (07h int 21h)
Функция 07h аналогична функции 01h, за исключением
того, что вводит символ с клавиатуры без ожидания его ввода, без эха и
без проверки нажатия комбинации Ctrl+C (Ctrl+Break). Вход: АН = 07h —
чтение символа без эха. Выход: AL = ASCII-код символа или 0 (см.
описание функции 01h int 21h).
Наличие нуля в регистре AL говорит о том, что в буфере
клавиатуры находится расширенный ASCII-код и необходимо повторить вызов
функции с тем, чтобы прочитать его второй байт.
Чтение без эха символа с клавиатуры (08h int 21h)
Функция 08h аналогична функции 01h, за исключением того, что вводит символ
с клавиатуры без отображения его на экране (без эха).
Вход: АН = 08h — чтение символа без эха.
Выход: AL = ASCII-код символа или 0 (см. описание функции 01h int 21h).
Наличие нуля в регистре AL говорит о том, что в буфере
клавиатуры находится расширенный ASCII-код и необходимо повторить вызов
функции с тем, чтобы прочитать его второй байт. Функция производит
проверку нажатия комбинации Ctrl+C (Ctrl+Break), при наличии которого
вызывается прерывание int 23h.
Ввод строки символов с клавиатуры (0ah int 21h)
Функция 0ah вводит строку символов в буфер памяти специального формата. Если символов в буфере клавиатуры нет, то функция ожидает их ввода. Конец ввода — нажатие клавиши Enter (0dh). Формат буфера:
- первый байт буфера содержит количество символов для ввода с учетом символа 0dh, завершающего процесс ввода;
- второй байт содержит реальное число введенных символов, но уже без учета завершающего символа 0dh;
- начиная с третьего байта содержится строка введенных символов с завершающим символом 0dh, максимальная длина строки — 254 символа.
Вход: АН = 0ah — ввод строки в буфер (до 254
символов); DS:DX — адрес буфера, первый байт которого должен содержать
количество символов для ввода.
Выход: введенная строка начиная с третьего байта буфера по адресу в DS:DX, длина строки во втором байте буфера.
Перед вызовом функции 0ah в первый байт буфера необходимо
поместить значение максимальной длины строки. Если первый байт равен
нулю, то вызов функции игнорируется и программа продолжает выполнение
без ожидания ввода строки. Функция производит проверку нажатия
комбинации Ctrl+C (Ctrl+Break), при наличии которого вызывается
прерывание int 23h. Вводимая строка отображается на экране. Буфер ввода
для данной функции лучше оформлять в виде структуры.
;prg05_07.asm - программа ввода строки функцией OAh int 21h
buf_Oahstruc
len_bufdb 11 :длина buf_0ah
len_in db 0 действительная длина введенного слова (без учета Odh)
buf_in db 11 dup (20h) ;буфер для ввода (с учетом Odh)
ends
.data
buf buf_0ah<>
adr_bufdd buf
.code
..........
:вводим 10 символов с клавиатуры
Ids dx,adr_buf
movah.Oah
int 21h обработка введенной строки
Получить состояние клавиатуры (0Bh int 21h)
Функция 0Bh проверяет наличие в буфере символа для ввода.
Вход: АН = 0Bh — проверка состояния клавиатуры.
Выход: AL = 0ffh — буфер клавиатуры содержит символ для ввода; AL = 0 — буфер клавиатуры пуст.
Данная функция формирует только логический результат —
присутствует символ в буфере или буфер пуст, поэтому вызов функции 0Bh
необходимо комбинировать с одной из функций извлечения символа из буфера
ввода. Использование этой функции удобно для программ, управление
которыми производится с клавиатуры, — типа командного процессора. В
процессе своей работы они постоянно ожидают ввода пользователем
управляющих команд, в связи с чем периодически проверяют входной буфер.
Функция производит проверку нажатия комбинации Ctrl+C
(Ctrl+Break), при наличии которого вызывается прерывание int 23h.
Ввод с клавиатуры с предварительной очисткой буфера (ОСh int 21h)
функция 0Ch выполняет ввод, предварительно очищая
буфер клавиатуры. Это удобно для предотвращения чтения из буфера
оставшихся там символов, возможно, введенных ошибочно или случайно.
Функция гарантирует, что программа получит именно те данные, которые
ввел оператор. Важно отметить, что функция 0Ch выполняет только очистку
буфера, ввод символа осуществляет одна из функций, номер которой
указывается в регистре AL при вызове этой функции/ Вход: АН = 0Ch — ввод
с клавиатуры с предварительной очисткой; AL = номер
функции (01h, 06h, 07h, 08h, 0ah). Выход: определяется функцией, указанной в AL при вызове функции.
Функция производит проверку нажатия комбинации Ctrl+C
(Ctrl+Break), при наличии которого вызывается прерывание int 23h.
Функции MS DOS для вывода данных на экран
Для вывода данных на экран можно использовать два
вида функций: универсальную функцию 40h (вывод в файл) и группу
специализированных функций MS DOS вывода на экран.
Использование функции 40h уже рассматривалось в разделе,
посвященном работе с файлами. Материал, представленный ниже, посвящен
второй группе функций — функциям MS DOS для вывода символов на экран. В
группу входят три функции. Рассмотрим их.
Вывод символа на экран (02h int 21h)
Функция 02h позволяет вывести один символ на экран. Вход: АН » 02h — вывод символа; DL = символ для вывода.
Функция 02h проверяет наличие в клавиатурном буфере символов
нажатия комбинации Ctrl+C (Ctrl+Break), при обнаружении которых
производится вызов прерывания int 23h. В процессе вывода функция
реагирует на управляющие символы, такие как 0dh (возврат каретки), 0ah
(перевод строки), 08h (курсор назад на один символ), 07h (звуковой
сигнал) и т. д.
Для того чтобы вывести строку, необходимо использовать цикл.
;выводим строку string на экран
mov ex.len_string :длину строки
lea si.string ;адрес строки
mov ah. 02h ml: mov dl.byte ptr [si]
int 21h
inc si
loop ml
Прямой вывод символа на экран (06h int 21h)
Функция 06h выводит один символ на экран. Эта
функция универсальна, так как "используется и для ввода (см. выше), и
для вывода символа.
Вход: АН = 06h — вывод символа на экран; DL = символ для вывода (за исключением 0ffn).
Функция 06h не проверяет наличие в буфере символов нажатия
комбинации Ctrl+C (Ctrl+Break). Порядок использования данной функции
аналогичен порядку использования функции 02h.
Вывод строки на экран (09h int 21h)
Функция 09h выводит строку символов на экран.
Строка должна обязательно заканчиваться символом $. Данную функцию
удобно использовать для вывода на экран различных диагностических
сообщений. Если требуется организовать вывод строк, длина которых
формируется динамически, то лучше либо использовать упомянутую выше
функцию 40h, либо выводить их в цикле, тело которого содержит одну из
функций 02h или 06h.
Вход: АН = 09h — вывод строки на экран; DS: DX — адрес строки для вывода с завершающим символом $.
Функция 09h проверяет наличие в клавиатурном буфере символов
нажатия комбинации Ctrl+C (Ctrl+Break), при обнаружении которых
производится вызов прерывания int 23h. В процессе вывода функция
реагирует на управляющие символы, такие как 0dh (возврат каретки), 0ah
(перевод строки), 08h (курсор назад на один символ), 07h (звуковой
сигнал) и т. д.
Приведенный ниже фрагмент показывает порядок применения функции 09h.
:prg05_09.asm - программа вывода строки на экран функцией 09h int 21h
.data
string db "Строка для вывода функцией 09h $"
adr_string dd string
.code
:выводим строку string на экран
Ids dx.adr_string ;адрес строки в DS:DX
mov ah.09h