7.4. Системные прерывания для ввода и вывода символов

Рассмотрим несколько первых функций прерывания 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