- •Прерывания
- •Команды прерывания
- •Функции вывода
- •Int 21h ;Вызов dos для исполнения
- •Int 21h ;Вызов dos для исполнения
- •Int 21h ;ВызовDos
- •Функции ввода
- •Int 21h ;ВызовDos
- •Int 21h ;ВызовDos
- •Int 21h ;ВызовDos
- •Int 21h ;ВызовDos
- •Int 21h ;ВызовDos
- •Int 21h ;ВызовDos
- •Int 21h ;Вызов dos для исполнения
- •Int 21h ;Вызов dos для исполнения
- •Int 21h ;Вызов dos для исполнения
- •Int 21h ;Вызов dos для исполнения
Int 21h ;ВызовDos
Получение статуса ввода (0Вh)
Функция 0Вhпроверяет стандартный буфер ввода на наличие в нем символов. Если есть символ, то регистрAL=0FFh, в противном случаеAL=0.
Пример.
mov AH, 0Вh ;Проверка статуса ввода
Int 21h ;ВызовDos
Чтение из файла или входного устройства (3Fh)
Функция может использоваться для чтения строки символов из файла или входного устройства. Регистр DXсодержит смещение входного буфера, размер которого больше или равен значению величины, помещенной в регистр СХ. Регистр ВХ определяет стандартное входное устройство или индекс файла. Для стандартной клавиатуры значение регистра ВХ=0. В регистре СХ находится значение максимального количества байтов для чтения. В регистре АХ возвращается число реально считанных символов. Функция может считывать символы и прекращает работу при нажатии клавиши <Enter>.
Пример.
.DATA
buffer DB 127 dup (0)
.CODE
…
mov AH, 3Fh ;Чтение из файла/консоли
mov BX,0
mov CX,127
mov DX,offset buffer
Int 21h ;ВызовDos
Клавиши, не имеющие соответствующего кода ASCII, называются управляющими клавишами. В их число входят клавиши перемещения курсора, клавиши <PgUp>, <PgDown>, <Home>, <End> и другие. При нажатии управляющей клавиши первым символом, помещаемым во входной буфер, будет 00h. Чтобы получить скан-код нажатой клавиши, необходимо получить из буфера еще один символ.
Пример 1.
mov AH, 07h ;Функция ввода с консоли
int 21h ;ВызовDOS, AL=0
int 21h ;AL содержит скан-код
mov scan, AL
Пример 2. Ожидание ввода пробела
loop1: mov ah,7 ; нефильтр. ввод без эха
int 21h
cmp al,' ' ; Пробел?
jnz loop1 ; Нет !
Функции DOSдаты/ времени
Рассмотрим функции DOSдля работы с датами и временем.
Получение даты (2Аh)
Функция возвращает текущую системную дату, помещая год в регистр СХ, а номер месяца – в регистр DH. Номер дня помещается в регистрDL, а день недели – в регистрAL. Для дней недели используются числовые обозначения: 0 – воскресенье, 1 – понедельник и т.д.
Пример.
mov AH, 2Аh
int 21h
mov year, CX
mov month, DH
mov day, DL
mov dayofweek, AL
Установка даты (2Вh)
Функция устанавливает текущую системную дату, используя те же регистры, что и для функции 2Ah. Функция возвращает значение 0 в регистрAL, если изменение прошло успешно, или значение 0FFh, если данные не были изменены.
Пример.
mov AH, 2Вh
mov CX, year
mov DH, month
mov DL, day
mov AL, dayofweek
int 21h
cmp AL, 0
jne baddate
Получение времени (2Сh)
Функция возвращает текущее системное время, помещая часы в регистр CH, минуты – в регистрCL, секунды – вDHи сотые доли секунд – вDL.
Пример.
mov AH, 2Сh
int 21h
mov hours, CH
mov minutes, CL
mov seconds, DH
Установка времени (2Dh)
Функция устанавливает текущее системное время, используя те же регистры, что и для функции 2Сh. Функция возвращает значение 0 в регистрAL, если изменение прошло успешно, или значение 0FFh, если данные не были изменены.
Пример.
mov AH, 2Dh
mov CH, hours
mov CL, minutes
mov DH, seconds
int 21h
cmp AL, 0
jne badtime
Ввод и вывод числовой информации
Арифметические команды могут обрабатывать четыре типа чисел – беззнаковые двоичные, знаковые двоичные, беззнаковые упакованные десятичные и беззнаковые неупакованные десятичные. Двоичные числа могут быть 8- и 16-разрядными. Десятичные упакованные числа содержат в байте две цифры, неупакованные – одну.
Упакованные десятичные числа содержат в каждом байте две десятичных (0 – 9) цифры. В старшем полубайте содержится старшая значащая цифра, в младшем – младшая. Каждая десятичная цифра представляется в двоичном (или, что то же самое, в шестнадцатеричном) коде. Диапазон представления упакованных десятичных чисел в байте 0 – 99. Сложение и вычитание упакованных десятичных чисел осуществляется в два этапа.
Сначала байты складываются или вычитаются как беззнаковые двоичные числа, а затем соответствующая команда коррекции приводит результат к виду правильного упакованного десятичного числа. Команды коррекции для умножения и деления упакованных десятичных чисел отсутствуют.
Неупакованные десятичные числа содержат в байте одну десятичную цифру в младших четырех разрядах. Старшие четыре разряда должны быть нулями. Ниже приведена арифметическая интерпретация 8-разрядных двоичных чисел.
Таблица 1
|
Шестнадца-теричный код |
Двоичный код |
Беззнаковое двоичное |
Знаковое двоичное |
Неупакован-ное десятичное |
Упакован-ное десятичное |
|
07 |
00000111 |
7 |
+7 |
7 |
7 |
|
89 |
10001001 |
137 |
-119 |
недействит. |
89 |
|
С5 |
11000101 |
197 |
-59 |
недействит. |
недействит. |
Неупакованное десятичное число легко может быть преобразовано в ASCII-представление соответствующей цифры. Для этого в старший байт неупакованного десятичного числа следует поместить значение 3.
Рассмотрим команды для работы с этими форматами чисел.
ААА
Команда ААА (коррекция сложения неупакованных десятичных чисел) приводит содержимое регистра AL к виду правильного неупакованного десятичного числа, старший полубайт при этом обнуляется. Команда ААА изменяет значение флагов FC и AC; содержимое флагов OF, PF, SF и ZF после выполнения команды ААА неопределено.
Пример.
mov AX, 0605h ;неупакованное десятичное 65
add AL, 09h ;AХ=060Eh
aaa ;AX=0704h
DAA
Команда DAA (десятичная коррекция сложения) приводит содержимое регистра AL к виду правильного упакованного десятичного числа после предшествующей команды сложения. Команда DAA изменяет значение флагов AF, CF, PF, SF и ZF; содержимое флага OF после выполнения команды DAA не определено.
Пример.
mov AL, 87h ;упакованное десятичное 87
add AL, 04h ;AL=88h
daa ;AX=91h
AAS
Команда AAS (коррекция вычитания неупакованных десятичных чисел) корректирует результат предшествующего вычитания двух правильных неупакованных десятичных чисел. Операндом назначения в команде вычитания должен быть регистр AL. Команда AAS приводит значение в AL к виду правильного неупакованного десятичного числа; старший полубайт при этом обнуляется. AAS воздействует на флаги AF и CF; Значение флагов OF, PF, SF и ZF после выполнения команды AAS не определено.
DAS
Команда DAS (десятичная коррекция вычитания) корректирует результат предшествующего вычитания двух правильных неупакованных десятичных чисел. Операндом назначения в команде вычитания должен быть регистр AL. Команда DAS приводит значение в AL к виду двух правильных упакованных десятичных чисел. Команда DAS воздействует на флаги AF и CF. Значение флагов OF, PF, SF и ZF после выполнения команды DAS не определено.
ААМ
Команда ААМ (коррекция умножения неупакованных десятичных чисел) приводит результат предшествующего умножения к двум правильным неупакованным десятичным цифрам. Для получения правильного результата после выполнения коррекции старшие полубайты умножаемых операндов должны быть нулевыми, а младшие должны быть правильными двоично-десятичными цифрами.
Команда ААМ воздействует на флаги PF, SF и ZF. Содержимое флагов AF, CF и OF после выполнения команды ААМ неопределено.
AAD
Команда AAD (коррекция деления неупакованных десятичных чисел) модифицирует содержимое регистра AL перед выполнение деления так, чтобы при выполнении деления в частном получилось правильное неупакованное десятичное число. Для получения правильного результата после выполнения деления содержимое регистра AH должно быть нулевым. Команда ААD воздействует на флаги PF, SF и ZF. Содержимое флагов AF, CF и OF после выполнения команды ААD неопределено.
Пример 1. Вывод неупакованного десятичного числа на экран
mov AX, 0605h ;неупакованное десятичное 65
add AL, 09h ;AХ=060Eh
aaa ;AX=0704h
or AX, 3030h
mov DL,AH ;Отображаемый символ
push AX
mov AH, 6h ;Выбор функции 6
