Функции прерывания 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 с.: ил.



Наши рекомендации