Функции прерывания MS-DOS (прерывание INT 21H)
Функции прерывания INT 21H работают со стандартным устройством ввода и стандартным устройством вывода, которыми по умолчанию являются клавиатура и монитор.
Некоторые функции данного прерывания приведены в табл.12.4.
Таблица 12.4. Функции прерывания INT 21H
Назначение и номер функции | Значения остальных регистров при вызове | Значения регистров при возврате |
Чтение символа из стандартного устройства ввода с эхом Функция читает один символ из буфера стандартного устройства ввода. Если символа нет, то функция переходит в состояние ожидания. Отображает этот символ на стандартное устройство вывода (эхо). AH = 01H | – | AL – ASCII код символа |
Вывод символа на стандартное устройство вывода Функция посылает один символ на стандартное устройство вывода и перемещает курсор на одну позицию вперед. AH = 02H | DL – символ | – |
Прямой ввод-вывод символов Функция выполняет чтение одного символа из стандартного устройства ввода без эха и без перехода в режим ожидания. Если символ есть, то сбрасывается флаг ZF и считывается ASCII код символа. Если символа нет, то флаг ZF устанавливается и управление передается вызывающей программе. Функция выполняет вывод символа на стандартное устройство вывода. AH = 06H | DL – код символа при выводе DL = FFH при вводе | При выводе нет. При вводе: Есть символ в буфере: ZF = 0 AL – ASCII код символа Нет символа в буфере: ZF = 1 |
Окончание табл. 12.4
Вывод строки символов Функция выводит на стандартное устройство вывода строку символов, которая оканчивается знаком $. AH = 09H | DS:DX – адрес строки | – |
Проверка состояния ввода Функция определяет состояние буфера стандартного устройства ввода AH = 0BH | – | Есть символ в буфере: AL = 0FFH Нет символа в буфере: AL=00H |
Определить системную дату Функция определяет системную дату. AH = 2AH | – | CX – Год DH – Месяц DL – День AL – день недели (0 – воскресенье: 1 – понедельник и т.д.) |
Определить системное время Функция определяет системное время. AH = 2CH | – | CH – часы (0…23) CL – минуты (0…59) DH – секунды (0…59) DL – сотые доли секунды (0…99) |
Завершить программу Функция выполняет завершение текущей программы. AH = 4CH | AL – код завершения (0 – успешное выполнение программы) | – |
Рассмотрим пример COM-программы, которая
– выводит на экран приглашение к работе;
– принимает с клавиатуры символ;
– вывод на чистом экране строки принятого символа по типу:
ААААА ААААА ААААА |
Текст программы на языке ассемблера приведен на рис.12.3.
codesg SEGMENT PARA 'Code'
ASSUME CS:codesg,DS:codesg,SS:codesg,ES:nothing
ORG 100H
begin: JMP main
;-------------------------------------------------------------
prigl DB 'Введите символ','$'
symb DB ?
;-------------------------------------------------------------
main PROC NEAR
CALL ochist ;Очистить экран
MOV DX,0000H ;Установить курсор в 00,00
CALL ustkurs
;Вывод на экран приглашения
;-------------------------------------------------------------
LEA DX,prigl ;Адрес строки приглашения
MOV AH,09H ;Функция вывода строки
INT 21H ;Вызов прерывания MS-DOS
;-------------------------------------------------------------
;Принять символ с клавиатуры
;-------------------------------------------------------------
MOV AH,00H ;Функция чтения символа с ожиданием
INT 16H ;Вызов прерывания BIOS
MOV symb,AL ;Сохранить символ в памяти
;-------------------------------------------------------------
CALL ochist ;Очистить экран
MOV CX,3
MOV DX,0A0AH ;Установить курсор в 10,10
m1: CALL ustkurs
PUSH CX
MOV AL,symb
CALL vyvod ;Вывод на экран строки
POP CX
INC DH ;Изменить номер строки
LOOP m1 ;Цикл вывода строк
;Завершение программы
;-------------------------------------------------------------
MOV AX,4C00H ;Функция завершения программы
INT 21H ;Вызов прерывания MS-DOS
;-------------------------------------------------------------
main ENDP
Рис. 12.3. Программа вывода символов на экран
;Установка курсора
;-------------------------------------------------------------
ustkurs PROC NEAR ;DX уже установлен
MOV AH,02H ;Функция установки курсора
MOV BH,00H ;Страница №0
INT 10H ;Вызов прерывания BIOS
RET
ustkurs ENDP
;-------------------------------------------------------------
;Очистка экрана
;-------------------------------------------------------------
ochist PROC NEAR
MOV AX,0600H ;Функция прокрутки экрана
MOV BH,100B ;Красный цвет символов
MOV CX,0000H ;От 00,00
MOV DX,184FH ;До 24,79
INT 10H ;Вызов прерывания BIOS
RET
ochist ENDP
;-------------------------------------------------------------
;Вывод символов на экран
;-------------------------------------------------------------
vyvod PROC NEAR
MOV AH,09H ;Функция записи символов в позицию курсора
MOV BH,00H ;Страница №0
MOV BL,001B ;Синий цвет символов
MOV CX,5 ;Число повторений
INT 10H ;Вызов прерывания BIOS
RET
vyvod ENDP
;-------------------------------------------------------------
codesg ENDS
END begin
Окончание рис. 12.3
Вопросы для самопроверки
1. Написать на языке ассемблера COM-программу, которая
– выводит на экран приглашение к работе;
– принимает с клавиатуры символ;
– выводит на чистом экране строки принятого символа по типу:
ААААА АА ААААА AA |
2. Написать на языке ассемблера COM-программу, которая
– выводит на экран приглашение к работе;
– принимает с клавиатуры символ;
– выводит на чистом экране строки принятого символа по типу:
А АА ААА AAAA |
3. Написать на языке ассемблера COM-программы, которая
– выводит на экран приглашение к работе;
– принимает с клавиатуры символ;
– выводит на чистом экране строки принятого символа по типу:
ААААА ААAAA ААААА AAAAA |
4. Написать на языке ассемблера программу типа COM для нахождения минимального элемента в числовом массиве произвольной длины и вывода на экран строки символом, принятым с клавиатуры, полученной длины (равной минимальному элементу).
5. Написать на языке ассемблера программу типа COM для нахождения максимального элемента в числовом массиве произвольной длины и вывода на экран строки символом, принятым с клавиатуры, полученной длины (равной максимальному элементу).
СПИСОК ЛИТЕРАТУРЫ
1. Абель, П. Язык Ассемблера для IBM PC и программирования / П. Абель. – М.: Высшая школа, 1992. – 447 с.: ил.
2. Голубь, Н.Г. Искусство программирования на Ассемблере. Лекции и упражнения / Н.Г. Голубь. – 2-е изд., испр. и доп. – СПб.: ООО «Диасофт ЮП», 2002. – 656 с.: ил.
3. Ирвин, К. Язык ассемблера для процессоров Intel / К. Ирвин. – 4-е изд. – М.: Издательский дом «Вильямс», 2005. – 912 с.: ил.
4. Кулаков, В.Г. Программирование на аппаратном уровне: специальный справочник / В.Г. Кулаков. – 2-е изд. – СПб.: Питер, 2003. – 847 с.: ил.
5. Пильщиков, В.И. Программирование на языке ассемблера IBM PC / В.И. Пильщиков. – М.: ДИАЛОГ-МИФИ,1999. – 288 с.: ил.
6. Юров, В.И. Assembler. Учебник для вузов / В.И. Юров. – 2-е изд. – СПб.: Питер, 2003. – 637 с.: ил.