Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab3_asm_moi.DOC
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
108.54 Кб
Скачать

6

Лабораторная работа № 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 – вывод строки. Эта функция поддерживает несколько режимов: с перемещением курсора или без, с атрибутами символов или без.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]