2. Средства DOS

Как и в случае вывода на экран, DOS предоставляет набор функций для чтения данных с клавиатуры, которые используют стандартное устройство ввода STDIN, так что можно использовать в качестве источника данных файл или стандартный вывод другой программы.

Функция DOS 0Ah - Считать строку символов из STDIN в буфер

Ввод:

АН = 0Ah

DS: DX = адрес буфера

Вывод: Буфер содержит введенную строку

Для вызова этой функции надо подготовить буфер, первый байт которого содержит максимальное число символов для ввода (1-254), а содержимое, если оно задано, может использоваться как подсказка для ввода. При наборе строки обрабатываются клавиши Esc, F3, F5, BS, Ctrl-C/Ctrl-Break и т.д., как при наборе команд DOS (то есть Esc начинает ввод сначала, F3 восстанавливает подсказку для ввода, F5 запоминает текущую строку как подсказку, Backspace стирает предыдущий символ). После нажатия клавиши Enter строка (включая последний символ CR (0Dh)) записывается в буфер, начиная с третьего байта. Во второй байт записывается длина реально введенной строки без учета последнего CR.

Рассмотрим пример программы, выполняющей преобразование десятичного числа в шестнадцатеричное.

Пример №2.1

. model tiny ; модель памяти, в которой сегменты кода, данных и стека объединены.
. code ; сегмент кода, который содержит данные.
 org 100h ; начало СОМ-файла
start: ; метка начала кода программы
 mov dx,offset messagel ; DS: DX - адрес строки
 mov ah,9 ; номер функции DOS в АН
 int 21h ; вывести приглашение ко вводу message1
 mov dx,offset buffer ; DS: DX - адрес строки
 mov ah,0Ah ; номер функции DOS в АН
 int 21h ; считать строку символов в буфер
 mov dx,offset crlf ; DS: DX - адрес строки
 mov ah,9 ; номер функции DOS в АН
 int 21h ; перевод строки
 xor di,di ; DI = 0 - номер байта в буфере
 xor ax,ax ; АХ = 0 - текущее значение результата
 mov cl,blength
 xor ch,ch ; обнуляем регистр ch
 xor bx,bx ; обнуляем регистр bx
 mov si,cx ; SI - длина буфера
 mov cl,10 ; CL = 10, множитель для MUL
asc2hex: ; метка начала блока asc2hex:
 mov bl,byte ptr bcontents [di]
 sub bl,'0' ; цифра = код цифры - код символа "0",
 jb asc_error ; если код символа был меньше, чем код "0",
 cmp bl,9 ; или больше, чем "9",
 ja asc_error ; выйти из программы с сообщением об ошибке,
 mul cx ; иначе: умножить текущий результат на 10,
 add ax,bx ; добавить к нему новую цифру,
 inc di ; увеличить счетчик
 cmp di,si ; если счетчик+1 меньше числа символов -
 jb asc2hex ; продолжить (счетчик считается от 0)
 push ax ; сохранить результат преобразования
 mov ah,9 ; номер функции DOS в АН
 mov dx,offset message2 ; DS: DX - адрес строки
 int 21h ; вывести приглашение ко вводу message2
 pop ax ; считать из стека
 push ax ; записать в стек
 xchg ah,al ; поместить в AL старший байт
 call print_al ; вывести его на экран
 pop ax ; восстановить в AL младший байт
 call print_al ; вывести его на экран
 ret ; завершение СОМ-файла
asc_error: ; начало блока asc_error:
 mov dx,offset err_msg ; DS: DX - адрес строки
 mov ah,9 ; номер функции DOS в АН
 int 21h ; вывести сообщение об ошибке
 ret ; завершить программу
print_al: ; метка начала блока print_al:
 mov dh,al ; заносим в dh значение регистра al
 and dh,0Fh ; DH - младшие 4 бита
 shr al,4 ; AL - старшие
 call print_nibble ; вывести старшую цифру
 mov al,dh ; теперь AL содержит младшие 4 бита
print_nibble: ; процедура вывода 4 бит (шестнадцатеричной цифры)
 cmp al,10 ; три команды, переводящие цифру в AL
 sbb al,69h ; в соответствующий ASCII-код
 das ; (см. описание команды DAS)
 mov dl,al ; код символа в DL
 mov ah,2 ; номер функции DOS в АН
 int 21h ; вывод символа
 ret ; этот RET работает два раза - один раз для возврата из процедуры print_nibble, вызванной для старшей цифры и второй раз - для возврата из print_al
messagel db "Десятичное число: $" ; cтрока с содержащая выводимые данные.
message2 db "Шестнадцатеричное число: $" ; cтрока с содержащая выводимые данные.
err_msg db "Ошибка ввода" ; cтрока с содержащая выводимые данные.
crlf db 0Dh,0Ah, '$' ; cтрока с содержащая выводимые данные.
Buffer db 6 ; максимальный размер буфера ввода
blength db? ; размер буфера после считывания
bcontents: ; содержимое буфера располагается за концом СОМ-файла
 end start ; метка окончания кода программы

Функция 0Ah предоставляет удобный, но ограниченный способ ввода данных. Чаще всего используют функции посимвольного ввода, позволяющие контролировать отображение символов на экране, реакцию программы на функциональные и управляющие клавиши и т.д.

Функция DOS 01h - Считать символ из STDIN с эхом, ожиданием и проверкой на Ctrl-Break

Ввод: АН = 01h
Вывод: AL = ASCII-код символа или 0. Если AL = 0, второй вызов этой функции возвратит в AL расширенный ASCII-код символа

При чтении с помощью этой функции введенный символ автоматически немедленно отображается на экране (посылается в устройство STDOUT - так что его можно перенаправить в файл). При нажатии Ctrl-C или Ctrl-Break выполняется команда INT 23h. Если нажата клавиша, не соответствующая какому-нибудь символу (стрелки, функциональные клавиши Ins, Del и т.д.), то в AL возвращается 0 и функцию надо вызвать еще один раз, чтобы получить расширенный ASCII-код (см. приложение 1).

В трех следующих вариантах этой функции код символа возвращается в AL по такому же принципу.

Функция DOS 08h - Считать символ из STDIN без эха, с ожиданием и проверкой на Ctrl-Break

Ввод: АН = 08h
Вывод: AL = код символа

Функция DOS 07h - Считать символ из STDIN без эха, с ожиданием и без проверки на Ctrl-Break

Ввод: АН = 07h
Вывод: AL = код символа

Функция DOS 06h - Считать символ из STDIN без эха, без ожидания и без проверки на Ctrl-Break

Ввод:

АН = 07h

DL = 0FFh

Вывод:

ZF = 1, если не была нажата клавиша, и AL = 00

ZF = 0, если клавиша была нажата. В этом случае AL = код символа


Информация о работе «Разработка виртуальных лабораторных работ средствами эмулятора Emu8086»
Раздел: Информатика, программирование
Количество знаков с пробелами: 193894
Количество таблиц: 73
Количество изображений: 12

0 комментариев


Наверх