При работе с печатающими устройствами могут быть использованы прерывания: 14Н и 17Н BIOS и 21Н (AH = 4 и 5) DOS. Следует различать программирование для печатающих устройств параллельного типа (информация передается на принтер побайтово по 8-битовой шине) и печатающих устройств последовательного типа (информация передается по одному проводу последовательно по 1 биту), подсоединяемых к любому последовательному порту микропроцессора.
Печатающие устройства параллельного типа
l прерывание 17Н BIOS (номер принтера предварительно указывается в регистре DX):
l послать 1 символ в устройство печати: AH = 0. ASCII-код символа предварительно должен быть помещен в регистр AL. В регистре AH после завершения вывода символа возвращается признак успешности результата;
l инициировать принтер (посылка в порт служебных кодов): AH = 1;
l получить состояние принтера (в регистре AH): AH = 2.
l прерывание 21Н DOS, AH = 5:
l вывести на печать один символ: AH = 5. ASCII-код символа предварительно записывается в регистр DL. Фрагмент программы печати символа C (ASCII-код символа C равен 43h):
|
|
mov AH, 5
mov DL, 43H
int 21H
Если необходимо отпечатать строку, то следует, используя это же прерывание, организовать вывод символов в цикле, каждый раз помещая в регистр DL ASCII-код очередного символа, а в конце строки и код CR возврата каретки (ASCII-код = 13) и/или LF — перевода строки (ASCII-код = 10). Фрагмент программы печати строки: «Я печатаю»:
text db 'Я печатаю', 13
...
mov SI, 0; обнуляем смещение адреса символа в строке
mov AH, 5
print: mov DL, text[SI]
; помещаем в DL очередной символ из строки text
int 21H
inc SI; увеличиваем смещение адреса символа в строке на 1
cmp DL, 13
; сравниваем очередной символ с кодом возврата каретки
jne print
Печатающее устройство имеет свой буфер, где накапливает поступающие символы, пока не дождется символа CR или LF (поэтому возможна печать строки и в обратном направлении).
l Вывести на печать текстовый файл: AH = 40h. Используются функции расширенного управления файлами MS DOS по файловому указателю. Пример фрагмента программы для вывода на печать текстового файла, содержащего 50 байтов:
text db 50 dup(' ')
...
mov AH, 40H
mov BX, 4; указание устройства вывода
mov CX, 50; указание числа выводимых байтов
mov DX, offset text; указание начального адреса
; поля памяти, содержащей текст
int 21H