Рассмотрим несколько первых функций прерывания 21h, предназначенных для ввода и вывода символов. Звездочкой отметим функции, которые на ввод символа Ctrl/C реагируют завершением работы программы.
Функция 01*. Ввод с клавиатуры в AL с отображением на экран.
Функция 02*. Вывод символа из DL на экран.
Функция 03. Ввод символа в AL из стандартного вспомогательного устройства AUX. По умолчанию этим устройством является COM1.
Функция 04. Вывод символа из DL на стандартное вспомогательное устройство AUX.
Функция 05. Вывод символа из DL на устройство печати PRN.
Функция 06. Непосредственный ввод и вывод с консоли. Если при вызове этой функции регистр DL не равен FFh, то содержимое DL выводится на экран. Если же DL=FFh, то при нажатии клавиши ее код записывается в регистр AL и сбрасывается флаг CF, а при отсутствии нажатой клавиши флаг CF будет установлен в 1. Функция 06 не ожидает нажатия клавиши, не отображает введенный символ на экране, а на ввод Ctrl/C не завершает работу программы, а просто записывает в AL число 3 – ASCII-код символа Ctrl/C.
Функция 07. Непосредственный ввод с консоли без эха в регистр AL. Функция ожидает ввода символа.
Функция 08*. Действует как функция 07, но реагирует на Ctrl/C.
Функция 09. Вывод строки символов, находящихся по адресу DS:DX. Концом строки служит символ ‘$’.
Функция 0Ah. Буферизованный ввод с клавиатуры. Вводится последовательность символов, последний из которых – возврат каретки <ENTER>. Входом для этой функции служат:
· символьная строка, в первом байте которой указано максимальное число символов, которое можно ввести (включая возврат каретки);
· DS:DX – определяют адрес символьной строки.
После выполнения функции 0Ah символьная строка будет содержать следующие данные:
· первый байт – максимальное число символов; этот байт был определен перед вызовом функции;
· второй байт – число символов, исключая <ENTER>, введенных с клавиатуры;
начиная с третьего байта – символы, введенные с клавиатуры, последним из которых будет код 13 символа <ENTER>.
·
Пример. Напишем программу, выводящую введенные строки в середине экрана с миганием:
< 1 > title nmscroll.exe
< 2 > datasg segment
< 3 > namepar label byte ;начало буфера ввода
< 4 > maxnlen db 20 ;максимальная длина строки
< 5 > actnlen db ? ;число введенных символов
< 6 > namefld db 20 dup(‘ ‘) ;20 пробелов
< 7 > col db 0 ;номер столбца
< 8 > count db ?
< 9 > prompt db ‘name?’ ;подсказка
< 10 > row db 00 ;номер строки
< 11 > datasg ends
< 12 > ;————сегмент кодов————
< 13 > codesg segment
< 14 > assume cs:codesg, ds:datasg, es:datasg
< 15 >
< 16 > begin proc far
< 17 > push ds
< 18 > sub ax,ax
< 19 > push ax
< 20 > mov ax,datasg
< 21 > mov ds,ax
< 22 > mov es,ax
< 23 > mov ax,0600h
< 24 > call q10clr ;очистка экрана
< 25 > a20loop:
< 26 > mov col,0
< 27 > call q20curs ;установка курсора
< 28 > call b10prmp ;вывод подсказки
< 29 > call d10inpt ;ввод с помощью функции 0Ah
< 30 > cmp actnlen,0 ;введены ли символы
< 31 > jne a30 ;отличные от ENTER?
< 32 > mov ax,0600h ;если нет символов
< 33 > call q10clr ;очистка экрана
< 34 > ret
< 35 > a30: ;если есть символы
< 36 > call e10name ;вывод с 40 колонки
< 37 > jmp a20loop ;новая строка
< 38 > begin endp
< 39 >
< 40 > b10prmp proc
< 41 > lea si,prompt
< 42 > mov count,5
< 43 > b20:
< 44 > mov bl,70h
< 45 > call f10disp ;вывод символа [si] и атрибута 70h
< 46 > inc si
< 47 > inc col
< 48 > call q20curs ;сместить курсор вправо
< 49 > dec count ;count=count-1
< 50 > jnz b20
< 51 > ret
< 52 > b10prmp endp
< 53 >
< 54 > d10inpt proc
< 55 > mov ah,0Ah
< 56 > lea dx,namepar ;адрес для ввода
< 57 > int 21h
< 58 > ret
< 59 > d10inpt endp
< 60 >
< 61 > e10name proc ;вывод с миганием с колонки 40
< 62 > lea si,namefld
< 63 > mov col,40
< 64 > e20:
< 65 > call q20curs ;установка курсора в колонку 40
mov bl,0f0h ;инверсия и мигание
< 1 >
< 2 > call f10disp ;вывод символа/атрибута
< 3 > inc si
< 4 > inc col
< 5 > dec actnlen ;уменьшить число
< 6 > jnz e20 ;введенных символов на 1
< 7 > cmp row,20 ;если row=20, то
< 8 > jae e30 ;прокрутить экран
< 9 > inc row
< 10 > ret
< 11 > e30:
< 12 > mov ax,0601h
< 13 > call q10clr
< 14 > ret
< 15 > e10name endp
< 16 > f10disp proc
< 17 > mov ah,9 ;вывод символа/атрибута
< 18 > mov al,[si] ;символ из al
< 19 > mov bh,0 ;номер видеостраницы
< 20 > mov cx,1 ;cx — число символов
< 21 > int 10h
< 22 > ret
< 23 > f10disp endp
< 24 >
< 25 > q10clr proc
< 26 > mov bh,7 ;прокрутка, атрибут 7
< 27 > mov cx,0
< 28 > mov dx,184fh ;dh=24, dl=79
< 29 > int 10h
< 30 > ret
< 31 > q10clr endp
< 32 >
< 33 > q20curs proc
< 34 > mov ah,2 ;установка курсора
< 35 > mov bh,0 ;страница 0
< 36 > mov dh,row ;номер строки
< 37 > mov dl,col ;номер столбца
< 38 > int 10h
< 39 > ret
< 40 > q20curs endp
< 41 > codesg ends
< 42 > end begin