Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КНИГА_АСМ ассемблер.doc
Скачиваний:
61
Добавлен:
19.11.2019
Размер:
732.16 Кб
Скачать
  1. Приложение

    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. Ожидаемую длину строки проставляет программист при создании буфера. При этом ввести больше символов, чем ожидается, невозможно.

  • INT 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 = размер оставляемой в памяти части в байтах.