Лекции по Вычислительным машинам, системам и сетям   

6. Приложение

6.1. Сервисные прерывания DOS

Информация в этом и следующем разделах пособия в основном взята из книги К.Г. Финогенова «Самоучитель по системным функциям MS DOS».

INT 21h, функция 01h ‑ ввод символа с эхом. Вводит ASCII-код символа с клавиатуры, при этом вводимый символ автоматически отображается на экране в позиции курсора (эхо ‑ отображение). Для чтения СКЭН-кода клавиши требуется повторное выполнение этой функции. При отсутствии символа функция ждет его ввода.

При вызове: ah = 01h.

При возврате: al = ASCII- (СКЭН)-код символа.

INT 21h, функция 02h ‑ вывод символа. Выводит символ на экран. Коды ASCII: 07h – звонок, 08h – шаг назад, 09h – табуляция, 0dh – возврат каретки, 0ah – перевод строки рассматриваются как управляющие и выполняют соответствующие действия.

При вызове: ah = 02h.

dl = ASCII-код выводимого символа.

INT 21h, функция 06h ‑ прямой ввод ‑ вывод. Вводит код символа с клавиатуры или выводит его на экран. В режиме вывода коды ASCII: 07h – звонок, 08h – шаг назад, 0dh – возврат каретки, 0ah – перевод строки рассмат-риваются как управляющие и выполняют соответствующие действия. Для чтения СКЭН-кода требуется повторное выполнение данной функции. При вводе функция не ждет нажатия клавиши, а возвращает управление в программу.

При вызове: ah = 06h.

dl = ASCII-код символа (00-FEh) при выводе.

dl = FFh при вводе.

При возврате: al = ASCII-код символа при вводе, если символа нет ‑ zf = 1.

INT 21h, функция 07h ‑ нефильтрованный ввод без эха. Аналогична функции 01h (см. выше), только нет эхо - отображения.

INT 21h, функция 08h ‑  ввод символа без эха. Практически аналогична функции 07h.

INT 21h, функция 09h ‑ вывод строки. Выводит на экран строку символов. Строка должна заканчиваться символом $. Коды ASCII: 07h – звонок, 08h – шаг назад, 0dh – возврат каретки, 0ah – перевод строки рассматрива-ются как управляющие и выполняют соответствующие действия.

При вызове: ah = 09h.

ds:dx = адрес первого символа строки.

INT 21h, функция 0ah ‑ буферизированный ввод с клавиатуры. Вводит строку символов с клавиатуры в созданный в программе буфер. Вводимая строка отображается на экране. Строка должна заканчиваться кодом ENTER (0dh).

При вызове: ah = 0ah.

ds:dx = адрес буфера.

При возврате: Данные помещены в буфер. Формат буфера:

байт 0 – ожидаемая длина строки;

байт 1 – фактическая длина введенной строки;

байт 2 и далее – строка, заканчивающаяся 0dh.

Ожидаемую длину строки проставляет программист при создании буфера. При этом ввести больше символов, чем ожидается, невозможно.

NT 21h, функция 25h ‑ установка вектора прерывания. Позволяет записать новый вектор в заданное место таблицы прерываний.

При вызове: ah = 25h.

al = тип подменяемого вектора.

ds:dx  =  новый вектор.

INT 21h, функция 2ah. Получение текущей даты.

При вызове: ah = 2ah.

При возврате: cx = год (от 1980 до 2099); dh = месяц (от 1 до 12); dl = день (от 1 до 31); al = день недели (0 – воскресенье и т.д.).

INT 21h, функция 2ch ‑ получение текущего времени.

При вызове: ah = 2ch.

При возврате: ch = часы (от 0 до 23); cl = минуты (от 0 до 59); dh = секунды (от 0 до 59).

INT 21h, функция 31h ‑ завершение программы и сохранение ее резидентной в памяти.

При вызове: ah = 31h.

dx = объем оставляемой в памяти части программы.

Объем оставляемой части измеряется здесь в парагра-фах. Параграф – 16 байт. Если нам известен объем в байтах (n), то объем в параграфах считается так:(целое от n/16)+1.

INT 21h, функция 4ch ‑ завершение процесса. Завершает текущий процесс (программу), освобождая всю выделенную процессу память.

При вызове: ah = 4ch.

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

При вызове: al = номер дисковода (0 – А, 1 – В,…).

cx = число читаемых секторов.

dx = логический номер начального сектора.

ds:bx = начальный адрес буфера.

При ошибке: флаг cf = 1, ax = код ошибки.

Примечание.

Коды ошибки в ah:

- 01hнеправильная команда;

- 02h – неправильная адресная метка;

-04hзапрошенный сектор не найден;

- 08hошибка прямого доступа к памяти;

- 10h – ошибка данных (неправильная контрольная сумма);

- 20h ошибка контроллера;

- 40h ошибка позиционирования.

Коды ошибки в al:

- 00hошибка защиты записи;

01h – неизвестное устройство;

02hдисковод не готов;

- 03hнеизвестная команда;

04hошибка данных (неправильная контрольная сумма);

06h ошибка позиционирования;

07h неизвестный тип носителя;

- 08h – сектор не найден.

INT 26h ‑ Абсолютная запись на диск. Позволяет записать из памяти на диск группу секторов, начиная с заданного, из созданного в памяти буфера. После этого прерывания в стеке задачи остается слово, содержащее значение регистра флагов. Если это слово не удалить, может нарушиться дальнейший ход программы.

При вызове: al = номер дисковода (0 – А, 1 – В,…).

cx = число записываемых секторов.

dx = логический номер начального сектора.

ds:bx = начальный адрес буфера.

При ошибке: флаг cf = 1.

ax = код ошибки (смотри INT 25h).

INT 27h ‑ завершить программу, оставив в памяти ее резидентную часть.

При вызове: dx = размер оставляемой в памяти части в байтах.



*****

© 2009-2017 Банк лекций siblec.ru
Лекции для преподавателей и студентов. Формальные, технические, естественные, общественные, гуманитарные, и другие науки.