Dos7book
.pdf
Глава 8: Вызовы обработчиков прерываний
В более "свежих" компьютерах INT 16\AH=01h действует так же и не реагирует на те клавиши, которых в старых клавиатурах нет.
8.01-85 INT 16\AH=12h – считывание состояний флагов клавиатуры
Обработчик вызовов INT 16\AH=12h считывает слово флагов из области данных BIOS, обычно из адреса 0040:0017h, показанного в таблице A.02-3
При вызове: |
|
AH |
= 12h |
При возврате: |
|
AX |
– слово флагов: |
|
бит 0: – нажата правая клавиша Shift |
|
бит 1: – нажата левая клавиша Shift |
|
бит 2: – нажата любая из клавиш CTRL |
|
бит 3: – нажата любая из клавиш ALT |
|
бит 4: – переключатель Scroll Lock включен |
|
бит 5: – переключатель Num Lock включен |
|
бит 6: – переключатель Caps Lock включен |
|
бит 7: – переключатель Insert включен |
|
бит 8: – левая клавиша CTRL нажата |
|
бит 9: – левая клавиша ALT нажата |
|
бит 10: – правая клавиша CTRL нажата |
|
бит 11: – правая клавиша ALT нажата |
|
бит 12: – клавиша Scroll Lock нажата |
|
бит 13: – клавиша Num Lock нажата |
|
бит 14: – клавиша Caps Lock нажата |
|
бит 15: – клавиша SysRq нажата (примечание 2) |
Примечание 1: в очень старых компьютерах с 84\86-клавишными клавиатурами аналогичную роль играет функция INT 16\AH=02h. Она отображает флаги только в битах 0 – 7 регистра AL. В более "свежих" компьютерах INT 16\AH=02h действует так же и не показывает те флаги, которых в старых компьютерах нет.
Примечание 2: нажатие клавиши SysRq фиксируется в слове флагов только когда удерживается нажатой любая (левая или правая) клавиша ALT.
8.01-86 |
INT 17\AH=00h – посылка одного знака на принтер |
|
При вызове: |
|
|
|
AH |
= 00h |
|
AL |
– код посылаемого знака |
|
DX |
– номер порта от 0000h до 0002h, соответствующий LPT1 – LPT3 |
– 379 –
Глава 8: Вызовы обработчиков прерываний
При возврате: |
|
|
|
AH |
– статус порта (и принтера) из таблицы A.14-3. |
8.01-87 |
INT 17\AH=01h – инициализация параллельного порта |
|
При вызове: |
|
|
|
AH |
= 01h |
|
DX |
– номер порта от 0000h до 0002h, соответствующий LPT1 – LPT3 |
При возврате: |
|
|
|
AH |
– статус порта (и принтера) из таблицы A.14-3. |
Примечание 1: возвращаемый при инициализации байт статуса не всегда отражает состояние правильно. Более надежные сведения можно получить, если после небольшой задержки вызвать INT 17\AX=0200h.
8.01-88 INT 17\AX=0200h – определить статус параллельного порта
Вызовы INT 17\AX=0200h обслуживаются как старыми версиями BIOS, так и более современными версиями EPP BIOS (Enhanced Parallel Port BIOS). В
устаревших компьютерах EPP BIOS отсутствует, и тогда будет возвращен только байт статуса в регистре AH (A.14-3). Точно так будут реагировать и современные компьютеры, если предустановленное значение в регистре BX не равно 5050h. Но вызовы с предустановленными значениями BX=5050h и CH=45h перехватывает EPP BIOS, и реакция будет иной: в регистрах DX:BX (или в ES:BX) будет возвращен адрес вызова дополнительных функций, показанных в таблице A.14-4, для обслуживания параллельных портов согласно спецификации IEEE 1284.
При вызове: |
|
AX |
= 0200h |
BX |
= 5050h, если вызов адресован EPP BIOS |
CH |
= 45h, если вызов адресован EPP BIOS |
DX |
– номер порта от 0000h до 0002h, соответствующий LPT1 – LPT3 |
При возврате: |
|
AH |
– статус порта (и принтера) из таблицы A.14-3. |
Статус AH = 03h при установленном (CY) флаге CF возвращает EPP BIOS, если она не поддерживает запрошенный LPT порт.
Статус AH = 00h при сброшенном (NC) флаге CF возвращает EPP BIOS, если она поддерживает запрошенный LPT порт, и тогда:
CX:AL = 4550:50h – сигнатура EPP BIOS версий 1.x CX:AL = 5050:45h – сигнатура EPP BIOS версий 3.x
EPP BIOS версий 1.x и 3.x возвращают ES без изменений и
DX:BX – сегмент: смещение для вызова функций EPP BIOS EPP BIOS версии 7 изменяет сегмент ES и возвращает:
– 380 –
Глава 8: Вызовы обработчиков прерываний
DX – базовый адрес для операций ввода-вывода EPP BIOS
ES:BX – сегмент: смещение для вызова функций EPP BIOS
Примечание 1: если вызов специально не адресован к EPP BIOS, то в регистрах BX и CH могут быть любые значения, кроме 5050h и 45h.
Примечание 2: изменение сегментного адреса в регистре ES является отличительным признаком наличия EPP BIOS последней 7-й версии, обеспечивающей управление мультиплексором LPT-порта.
8.01-89 INT 18 – бездисковая загрузка компьютера При вызове ничего подготавливать не требуется.
Система BIOS вызывает обработчика прерывания INT 18 тогда, когда не находит в компьютере диска, с которого можно было бы продолжить загрузку. В старых компьютерах вызов INT 18 запускал интерпретатор языка BASIC, записанный в постоянную память BIOS. При вызове INT 18 современные
компьютеры выводят на экран сообщение об отсутствии встроенного интерпретатора языка BASIC, после чего компьютер останавливается. Однако вызов INT 18 может быть перехвачен другим обработчиком, поставляемым в составе постоянного запоминающего устройства платы расширения. Таким способом, в частности, осуществляют бездисковую загрузку компьютеров через локальную сеть.
8.01-90 INT 19 – операции загрузки компьютера с диска
Обработчик прерывания INT 19 выполняет важную часть процедуры загрузки компьютера: он копирует boot-сектор с загрузочного раздела диска в адрес 0000:7C00h и передает управление туда. Сначала происходит обращение к тому диску, который указан первым в последовательности загрузочных дисков, установленной программой BIOS SETUP. С флоппи-дисков boot-сектор считывается непосредственно, а на жестких магнитных дисках адрес boot-сектора загрузочного раздела определяется из таблицы разделов в MBR (A.13-5). Если адресуемый диск недоступен, то производится попытка обращения к следующему диску из установленной последовательности. Если все попытки обращения к дискам закончатся неудачно, последним шагом будет вызов INT 18 (8.01-89).
Однако обработчик прерывания INT 19 не очищает память и не восстанавливает таблицу прерываний. Поэтому неподготовленные вызовы INT 19 обычно кончаются зависанием компьютера. При необходимости инициировать
перезагрузку компьютера из исполняемой программы следует пользоваться не вызовом INT 19, а либо командой FEh контроллера клавиатуры (примечание 3 к A.11-3), либо дальним переходом (CALL FAR, 7.03-08) по адресу F000:FFF0h
– 381 –
Глава 8: Вызовы обработчиков прерываний
(примечание 4 |
к A.12-1), где находится вход в программу загрузки у |
|
AT-совместимых компьютеров. |
||
8.01-91 |
INT 1A\AH=00h – системное время |
|
При вызове: |
|
|
|
AH |
= 00h |
При возврате: |
|
|
|
AL |
– не нуль, если данный запрос – первый после полуночи. |
|
CX |
– старшие 2 байта времени в тактах, 1800B0h тактов в сутки |
|
DX |
– младшие 2 байта времени в тактах, 18.2 такта в секунду |
Примечание 1: счет тактов обнуляется в полночь.
Примечание 2: число, возвращаемое в AL, используется операционной системой для счета дней. Если первый после полуночи запрос системного времени поступит не от операционной системы, то счет дней может быть нарушен.
Примечание 3: системное время можно установить с помощью INT 1A\AH=01h. При вызове INT 1A\AH=01h задаваемое число тактов должно быть аналогичным образом записано в регистрах CX и DX.
8.01-92 |
INT 1A\AH=02h – часы реального времени |
||
При вызове: |
|
|
|
|
AH |
= 02h |
|
При возврате: если флаг CF установлен, то возвращаемые данные не верны |
|||
Если флаг CF сброшен, то |
|||
|
CH |
– часы |
|
|
CL |
– минуты |
|
|
DH |
– секунды |
|
|
DL |
= 00h |
– стандартное время ("зимнее" в северном полушарии) |
|
|
= 01h |
– время светового дня ("летнее" в северном полушарии) |
Примечание 1: часы, |
минуты |
и секунды представляются в упакованном |
|
|
десятичном формате, по две десятичные цифры на байт. |
||
Примечание 2: часы |
реального |
времени можно установить с помощью |
|
|
INT 1A\AH=03h. |
Перед вызовом следует записать задаваемые |
|
|
значения в регистры CH, CL, DH и DL в той же форме. |
||
8.01-93 |
INT 1A\AH=04h – дата |
||
При вызове:
AH = 04h
При возврате: если флаг CF установлен, то возвращаемые данные не верны
– 382 –
Глава 8: Вызовы обработчиков прерываний
Если флаг CF сброшен, то
CH |
– столетие |
CL |
– год |
DH |
– месяц |
DL |
– день |
Примечание 1: все данные представляются в упакованном десятичном формате, по две десятичные цифры на байт.
Примечание 2: дату и связанные с ней данные можно установить с помощью INT 1A\AH=05h. Перед вызовом следует записать задаваемые значения в регистры CH, CL, DH и DL в той же форме.
8.01-94 INT 1A\AH=06h – установление времени регулярного действия
Обработчик прерывания INT 1A\AH=06h взводит "будильник" системы BIOS,
который после этого каждый день в заданное время будет вызывать прерывание INT 4A. Желаемое действие, как предполагается, будет выполнять обработчик прерывания INT 4A, который должен быть заранее написан пользователем и загружен.
При вызове: |
|
AH |
– 06h |
CH |
– час |
CL |
– минуты |
DH |
– секунды |
При возврате: если флаг CF сброшен, то миссия завершена успешно, а если флаг CF установлен, то произошла ошибка, например, "будильник" уже взведен.
Примечание 1: часы, минуты и секунды представляются в упакованном десятичном формате, по две десятичные цифры на байт.
Примечание 2: если задано значение FFh, то вызов INT 4A происходит при каждом приращении соответствующей величины. В частности, при CH=FFh вызов происходит каждый час, а при CH=CL=FFh – каждую минуту.
Примечание 3: "будильник" продолжает оставаться взведенным до тех пор, пока не будет сброшен посредством INT 1A\AH=07h, причем для сброса не нужны никакие другие приготовления, кроме AH = 07h.
8.01-95 INT 1B – реакция на нажатие "CTRL-Break"
При вызове ничего подготавливать не требуется.
Вызов INT 1B производится обработчиком прерывания INT 09 каждый раз,
когда контроллер клавиатуры сообщает о нажатии клавишной комбинации
– 383 –
Глава 8: Вызовы обработчиков прерываний
CTRL-Break. Устанавливаемый по умолчанию обработчик прерывания INT 1B взводит в состояние логической единицы флаг в области данных BIOS (бит 7 в байте со смещением 71h в таблице A.02-3), а потом возвращает управление вызывающей программе. Но состояние этого флага проверяют обработчики прерываний, установленные MS-DOS, когда их вызывает исполняемая программа. Обнаружив взведенное состояние флага, они вызывают обработчика прерывания INT 23. Именно он останавливает исполнение текущей программы и ответственен за все варианты последующего развития событий (1.01, 1.03, 8.02-83).
Подмена адреса обработчика прерывания INT 1B в таблице прерываний на адрес, указывающий на команду возврата IRET (7.03-30) – это распространенный
прием предохранения любого ответственного блока программы от прерывания исполнения по нажатию клавишной комбинации CTRL-Break.
8.01-96 INT 1C – перехват тактов счетчика системного времени При вызове ничего подготавливать не требуется.
Вызов INT 1C производится обработчиком прерывания INT 08 на каждом такте, то есть 18.2 раза в секунду. Устанавливаемый по умолчанию обработчик прерывания INT 1C просто возвращает управление вызывающей программе.
Однако любой резидентной программе предоставлено право загрузить свой собственный обработчик прерывания INT 1C, который мог бы регулярно ее вызывать, обеспечивая тем самым возможность обслуживания развивающихся во времени процессов.
8.02Обработчики от MS-DOS7 (INT 20 – INT 2E)
8.02-01 INT 20 – завершение исполнения программы
Обработчик прерывания INT 20 восстанавливает указатели в таблице прерываний по данным из префикса сегмента программы (PSP, A.07-1), высвобождает память, которую программа использовала, восстанавливает состояния стека и сегментных регистров, и затем передает управление туда, куда указывает INT 22 (8.02-82). Но INT 20 требует наличия сегментного адреса PSP в регистре CS: и не дает возможности оставить код ошибки (errorlevel, 3.15-03), характеризующий обстоятельства завершения программы. Чтобы избавиться от этих ограничений, рекомендуют завершать исполнение программ вызовом
INT 21\AH=4Ch (8.02-55).
При вызове:
сегментный адрес в регистре CS: должен указывать на начало PSP.
– 384 –
Глава 8: Вызовы обработчиков прерываний
При возврате:
возврата не будет.
Примечание 1: при исполнении программ в среде отладчика Debug.exe INT 20 и INT 21\AH=4Ch действуют неодинаково: INT 20 передает управление отладчику, тогда как INT 21\AH=4Ch закрывает сеанс работы с отладчиком и передает управление DOS.
Примечание 2: завершить программу без оставления кода ошибки можно также вызовом INT 21\AH=00h. MS-DOS7 поддерживает INT 21\AH=00h
ради сохранения совместимости со старыми программами.
8.02-02 INT 21\AH=01h – получение знака из канала ввода
Обработчик прерывания INT 21\AH=01h считывает знак из стандартного канала ввода STDIN (STandarD INput), записывает считанный знак в регистр AL и посылает копию считанного знака в стандартный канал вывода STDOUT (STandarD OUTput). Оба эти канала – STDIN и STDOUT – могут быть перенаправлены, но по умолчанию STDIN получает сигналы с клавиатуры, а STDOUT пересылает все на дисплей, и тогда при вызове INT 21\AH=01h компьютер начинает ожидать нажатия клавиши, а после нажатия отображает соответствующий знак на экране.
При вызове: |
|
AH |
= 01h |
При возврате: |
|
AL |
– код ASCII считанного знака |
Примечание 1: возвращаемый код ASCII представлен правыми двумя цифрами четырехзначных шестнадцатеричных чисел в таблице A.02-1.
Примечание 2: нельзя вызывать INT 21\AH=01h из командных файлов, которые исполняются с перенаправления: такие вызовы перехватывают из канала STDIN команды, предназначенные интерпретатору.
Примечание 3: функция INT 21\AH=01h проверяет состояние флага, взводимого клавишными комбинациями CTRL-C и CTRL-Break (8.01-95). Если окажется, что этот флаг взведен, то будет вызван обработчик прерывания INT 23.
Примечание 4: обработчик прерывания INT 21\AH=03h аналогичным образом считывает знак из канала STDAUX, который связан с портом
COM1.
– 385 –
