
Лабораторная работа № 3
Ввод и вывод данных
Цель работы
Целью работы является знакомство с возможностями ввода-вывода при обмене с системной консолью и их применение в программах, создаваемых на языке Ассемблера.
Введение
Любая программа должна принимать данные и выдавать данные. Стандартным устройством для обмена данными является системная консоль (system console), которая имеет имя устройства «con» в MS DOS. Системная консоль как устройство ввода представлена клавиатурой (keyboard), а как устройство вывода – экраном монитора (screen) в текстовом режиме. Поскольку все программы выполняют обмен с консолью одинаково, то эти функции введены в сервис BIOS и DOS.
В BIOS прием данных с клавиатуры выполняется функциями прерывания int 16h, а вывод символьной информации на экран – функциями прерывания int 10h. В MS DOS функции символьного ввода-вывода входят в состав сервиса «двадцать первого прерывания» int 21h.
Системная консоль при выводе на экран выводит символы в текстовом режиме. Стандартно это 25 строк по 80 колонок. Системная консоль при вводе с клавиатуры принимает коды, соответствующие нажатым клавишам. В перечисленных выше функциях DOS и BIOS используется кодирование символов в соответствии с таблицей ASCII (American Standard Code for Information Interchange).
Вызов функций DOS и BIOS выполняется по одинаковому соглашению: в регистр AH записывается номер функции. Если конкретная функция требует загрузки других регистров, то это также делается до вызова прерывания.
Символьный ввод-вывод DOS
Функция 02h – выдать один символ
В DL загрузить код символа.
Функция 09h – выдать строку символов
В DS:DX загрузить адрес строки. Строка должна заканчиваться символом ‘$’ (24h).
Функция 06h – консольный ввод и вывод
В DL загрузить код символа (от 00h до 0FEh) – для вывода символа.
В DL загрузить код 0FFh для ввода символа с клавиатуры. Выполняется ввод символа «без ожидания» с установкой флага ZF, если символа нет, либо сбросом флага ZF, если символ есть. В последнем случае код символа находится в AL. Эта функция при вводе не фильтрует символы (см. далее описание функции 07h).
Функция 01h – ввод с клавиатуры
Выполняется ввод символа с «ожиданием» и «эхом», т.е. введенный символ отображается на экране. Код символа находится в AL.
Функция 08h – ввод с клавиатуры без эха
Выполняется ввод символа с «ожиданием» но без «эха», т.е. введенный символ не отображается на экране. Код символа находится в AL.
Функция 07h – нефильтрующий ввод с клавиатуры без эха
Выполняется ввод символа с «ожиданием» без «эха». Код символа находится в AL. Отличается от предыдущих функций ввода тем, что не фильтрует, т.е. не проверяет входные символы на Ctrl-Break, не выполняя соответствующей реакции (int 23h – прерывание DOS). Обычная системная обработка Ctrl-Break вызывает немедленное снятие программы. При вводе символа функцией 07h программа должна сама распознать и обработать Ctrl-Break.
Функция 0Ah – ввод строки в буфер
До вызова этой функции необходимо подготовить буфер ввода, в котором первый байт содержит число MAX (максимальная длина вводимой строки), второй байт предназначен для счетчика, а последующие байты – для вводимой строки (включая завершающий байт для символа CR – возврат каретки, который соответствует нажатию клавиши «Enter»).
Символы считываются со стандартного ввода вплоть до CR (ASCII 0Dh) или до достижения длины MAX-1. Если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR. При вводе работают клавиши редактирования строки, а также «F5», «F3», «Esc». Символы в буфере используются как шаблон.
После окончания ввода строки функция возвращает в буфере количество символов (без CR) во втором байте и введенный текст, начиная с третьего байта (в т.ч. и символ CR).
Функция 0Bh – проверить статус ввода
Проверяет состояние стандартного ввода. Если в очереди на передачу в систему со стандартного устройства ввода (по умолчанию – клавиатура) имеется символ, то AL = 0FFh, иначе AL = 0. Функцию 0Bh следует использовать перед функциями 01h, 07h и 08h, чтобы избежать ожидания нажатия клавиши. Поскольку эта функция выполняет стандартную системную обработку Ctrl-Break, то ее можно использовать как простой способ проверки Ctrl-Break в процессе длинных вычислений или другой обработки, обычно не требующей ввода. Это позволяет снимать счет по нажатию Ctrl-Break.
Функция 0Ch – ввод с очисткой
Очищает буфер опережающего ввода стандартного устройства ввода, а затем вызывает функцию ввода, указанную в AL. Это заставляет систему ожидать ввод очередного символа. Так после очистки очереди можно вызвать следующие функции: 01h, 06h, 07h, 08h, 0Ah.
Примеры:
Вывод символа:
mov dl,’A’ ; код выводимого символа в DL
mov ah,02h ; номер функции
int 21h ; вызов DOS
Вывод строки:
.data
Text db ‘Файл не найден$’
…
.code
…
mov dx,offset Text ; адрес выводимой строки в DX
mov ah,09h ; номер функции
int 21h ; вызов DOS
Ввод символа:
mov ah,01h ; номер функции
int 21h ; вызов DOS (ожидание нажатия клавиши)
cmp al,’A’ ; принятый символ в AL (анализ)
При вводе нажатие некоторых клавиш («F3», «» и т.п.) или сочетаний клавиш («Ctrl-F2», «Alt-D», «Shift-F5» и т.п.) сопровождается выдачей двух байт в DOS. Первый байт содержит 00h (ноль), второй байт содержит т.н. «расширенный ASCII код клавиши». В этом случае для ввода расширенного кода функцию ввода необходимо вызывать дважды.
Символьный ввод-вывод bios Прерывание int 16h – ввод с клавиатуры
Имеется 3 функции этого прерывания:
00h читать (ожидать) клавишу,
01h проверить готовность символа (и показать его),
02h читать флаги клавиатуры (Shift, Ctrl, Alt, Num, Caps).
После ввода в AL находится ASCII код клавиши (или 00h), а в AH находится скан-код клавиши (или расширенный ASCII код).
Прерывание int 10h – видеосервис bios
Из многих функций видеосервиса BIOS символьный вывод выполняется следующими:
02h установить позицию курсора (DH,DL – строка 0..23, колонка 0..79),
09h писать символ/атрибут в текущей позиции курсора,
0Ah писать символ в текущей позиции курсора,
0Eh писать символ (эмуляция телетайпа),
13h писать строку (выдает строку в позиции курсора).
Функция 02h полезна возможностью управлять курсором, функция 09h позволяет управлять атрибутами текста (цвета, мерцание и т.п.). При использовании функции 0Ah курсор не перемещается после вывода символа, если это необходимо, можно пользоваться функцией 0Eh, которая перемещает курсор (эмуляция TTY). Для PC AT и выше (давно уже выполняется всеми современными PC) есть функция 13h – вывод строки. Эта функция поддерживает несколько режимов: с перемещением курсора или без, с атрибутами символов или без.