Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OSP / ОСП_2011 / Лабработа7 / Прерывания.doc
Скачиваний:
27
Добавлен:
11.04.2015
Размер:
124.42 Кб
Скачать

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 ; Нет !

    1. Функции 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

    1. Ввод и вывод числовой информации

Арифметические команды могут обрабатывать четыре типа чисел – беззнаковые двоичные, знаковые двоичные, беззнаковые упакованные десятичные и беззнаковые неупакованные десятичные. Двоичные числа могут быть 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

Соседние файлы в папке Лабработа7