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

Видеооперации с прерыванием 21h dos

  • Вывод символа на экран дисплея: AH = 2 или AH = 6 и DL <> 0FFh. В регистре DL должен быть ASCII-код символа. Пример фрагмента программы (вывод символа «C»):

mov AH, 6

mov DL, 43H ; 43H — это ASCII-код символа C

int 21H

  • Вывод строки символов: AH = 9 (чаще всего используемая функция). В регистрах DS:DX должен находиться начальный адрес строки символов, которая обязана заканчиваться символом $. Пример фрагмента программы (отображение текста 'вывод строки символов$'):

Text db 'вывод строки символов$'

mov AH, 9

mov DX, offset text ; это адрес выводимой строки

int 21H

  • Ввод/вывод из файла через логический номер. Стандартные файловые логические номера определяют тип и устройство ввода-вывода:

  • 0 — ввод с клавиатуры;

  • 1 — вывод на экран дисплея;

  • 2 — вывод на экран сообщения об ошибке;

  • 3 — ввод-вывод на внешнее устройство;

  • 4 — вывод на печать.

Для ввода предназначена функция AH = 3Fh прерывания 21H, для вывода служит функция AH = 40h прерывания 21H. В регистр CX предварительно заносится число вводимых-выводимых байтов, а в регистр DX записывается начальный адрес поля памяти для ввода-вывода. В случае успешного завершения процедуры ввода-вывода обнуляется флаг переноса CF, а в регистре AX возвращается количество фактически переданных байтов. При неудачной операции флаг CF устанавливается в 1, а в регистр AX заносится код ошибки. Приведенный ниже пример содержит фрагмент программы для вывода на экран текстового файла Text, содержащего 50 байтов.

text db 50 dup(' ')

mov AH, 40H

mov BX, 1 ; указание устройства вывода

mov CX, 50 ;указание числа выводимых байт

mov DX, offset text ; указание начального адреса

; поля памяти, содержащего текст

int 21H

Программирование работы с клавиатурой

При программировании работы с клавиатурой могут быть использованы прерывание 16Н BIOS и прерывание 21Н (AH = 1, 6, 7, 8, A, B, C) DOS.

Прерывание 16H BIOS предусматривает достаточно простые операции обмена данными с клавиатурой, полезные при написании программ, выполняемых независимо от операционной системы DOS. Так, при AH = 0 и 1 считываются из буфера клавиатуры scan-код клавиши в регистр AH и ASCII-код клавиши в регистр AL; при AH = 2 в AL возвращается байт состояния клавиатуры — состояние управляющих клавиш: Shift, Ctrl, Alt, Scroll Lock, Num Lock и Insert; при AH = 3 — устанавливаются режимы работы клавиатуры в IBM PCjr.

Ввод с клавиатуры по прерыванию 21H DOS предполагает.

  1. Чтение символа с клавиатуры (с ожиданием ввода) и отображением символа на экране дисплея: AH = 1 или AH = 6 и DL = 0FFh; то же, но без эха-отображения символа на экране дисплея: AH = 7 или AH = 8. Считанный символ (ASCII-код) помещается в регистр AL (scan-код не передается). Если к моменту запроса на чтение символа клавиша еще не нажата, то управление прерванной программе не будет возвращено до тех пор, пока это не будет сделано. Если код клавиши расширенный (клавиши F1–F10, Alt, Ctrl и т. д.), необходимо повторное чтение. Пример фрагмента программы чтения символа:

mov AH, 1

int 21H

  1. Чтение строки символов с буферизацией: AH = 0Ah. Для инициализации такого чтения необходимо:

  • задать буфер, указав в нем число символов строки, подлежащих вводу, директивой: buf DB n, 0, 0, ... , 0, 0 (buf — имя поля, которое, в принципе, может быть и любым другим); количество нулей в директиве должно быть на 2 больше, чем n (n — максимальное количество вводимых символов), на место следующего нуля будет после ввода записано количество фактически введенных символов, на место последующих «0» будут введены ASCII-коды символов строки и еще один 0 для кода клавиши Enter — 13;

  • занести в регистр DX адрес буфера.

При выполнении рассматриваемого прерывания управление прерванной (основной) программе не возвратится до тех пор, пока не нажаты все нужные клавиши и клавиша Enter. При нажатии каждой очередной клавиши ее код записывается в буфер клавиатуры и отображается на дисплее, но из буфера поступит в основную программу (в поле buf) только после нажатия клавиши Enter. Если до Enter клавиш нажато больше, чем указано в буфере, то раздастся звуковой сигнал и лишние символы восприняты не будут.

Пример фрагмента программы чтения строки символов:

buf DB 9,0,0,0,0,0,0,0,0,0,0,0

mov AH, 0AH

mov DX, offset buf

int 21H

В поле буфера будут записаны ASCII-коды символов строки, и, если в программе предусмотрены операции над двоичными кодами символов (цифр) строки, то есть она предполагает ввод числового значения, то необходимо преобразовать ASCII-коды в двоичный код числа.

  1. Чтение состояния клавиатуры: AH = 0Bh. В регистр AL записывается 0, если в буфере клавиатуры содержится хотя бы один символ.

  2. Очистка буфера клавиатуры и вызов функции: AH = 0Ch. Обнуляется буфер клавиатуры и инициируется выполнение одной из 5 функций прерывания 21H; в этом случае номер вызываемой функции должен быть записан не в регистре AH, а в регистре AL (AL = 1, 6, 7, 8 или 0Ah).

  3. Ввод с клавиатуры (из файла через логический номер): AH = 3Fh. Используется функция расширенного управления файлами MS DOS по файловому указателю. Ниже приведен пример фрагмента программы для ввода с клавиатуры 50 байтов:

text db 50 dup(' ') ; задание поля памяти для ввода

...

mov AH, 3FH

mov BX, 0 ; указание устройства ввода

mov CX, 50 ; указание числа вводимых байт

mov DX, offset text ; указание начального адреса

; поля памяти для ввода

int 21H

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