Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Dos7book

.pdf
Скачиваний:
97
Добавлен:
09.02.2015
Размер:
5 Мб
Скачать
☆

Глава 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 –

Глава 8: Вызовы обработчиков прерываний

8.02-03 INT 21\AH=02h – посылка знака в канал вывода

Обработчик прерывания INT 21\AH=02h посылает знак в стандартный канал вывода STDOUT, который по умолчанию пересылает все на дисплей, если не произведено перенаправление этого канала куда-либо еще.

При вызове:

 

AH

= 02h

DL

– код ASCII посылаемого знака

При возврате:

 

AH

– код посланного знака (кроме 09h, который заменяется на 20h).

Примечание 1: перенаправление канала STDOUT в файл производится без проверок наличия дискеты в дисководе, заполненности этой дискеты, защиты ее от записи и т.д. Но если в момент вызова дисковод занят, то обработчик прерывания INT 21\AH=02h будет ждать, пока дисковод завершит исполнение предыдущей операции.

Примечание 2: функция INT 21\AH=02h проверяет состояние флага, взводимого клавишными комбинациями CTRL-C и CTRL-Break (8.01-95). Если окажется, что этот флаг взведен, то будет вызван обработчик прерывания INT 23.

Примечание 3: обработчик прерывания INT 21\AH=06h делает то же, только не проверяет флаг CTRL-C\CTRL-Break. Однако вызов INT 21\AH=06h

действует совершенно по-другому при DL=FFh (8.02-04). Примечание 4: подобно тому, как INT 21\AH=02h посылает знак в канал STDOUT,

INT 21\AH=04h посылает знак в канал STDAUX (порт COM1), а INT 21\AH=05h – на принтер, подключенный к порту LPT1.

8.02-04 INT 21\AH=06h – копирование знака из канала ввода

Обработчик прерывания INT 21\AH=06h при условии DL = FFh делает почти то же, что INT 21\AH=01h, но:

–не проверяет флаг CTRL-C\CTRL-BREAK,

–не удаляет код знака из буфера клавиатуры,

–не вызывает ожидания нажатия клавиши,

–не посылает копию выводимого кода в канал STDOUT

–дополнительно воспринимает расширенные коды клавиш.

Под расширенными кодами клавиш имеются ввиду те, которые отличаются только скэн-кодами, а коды ASCII для всех таких клавиш (правые две цифры из чисел в таблице A.02-1) имеют значение 00h или E0h. Если BIOS сообщает любое из этих значений, то обработчик прерывания INT 21\AH=06h сбрасывает флаг ZF и устанавливает AL=00h. Это означает, что была нажата клавиша, которой

– 386 –

Глава 8: Вызовы обработчиков прерываний

соответствует расширенный код, и что следует вызвать INT 21\AH=06h повторно: тогда в регистре AL будет возвращен скэн-код (левые две цифры из чисел в таблице A.02-1), по которому такие нажатия клавиш различаются.

Коды ASCII, отличающиеся от 00h и E0h, записываются в регистр AL сразу, и тогда скэн-код не возвращается; повторный вызов INT 21\AH=06h допустим, но он будет исполняться как отдельный, не зависимый от предыдущего.

При вызове:

 

AH

= 06h

DL

= FFh (для других значений – примечание 3 к 8.02-03)

При возврате: если флаг ZF установлен, то отказ: канал STDIN пуст

Если флаг ZF сброшен, то

AL

– код знака (ASCII или скэн-код)

Примечание 1: INT 21\AH=07h делает то же самое, но игнорирует DL, вызывает ожидание нажатия клавиши, не меняет состояния флага ZF, и удаляет считанный код из буфера клавиатуры.

Примечание 2: INT 21\AH=08h делает то же самое, что INT 21\AH=07h, но сверх того вызывает INT 23 после нажатия CTRL-C или CTRL-BREAK.

Примечание 3: нельзя вызывать INT 21\AH=06h-08h из командных файлов, которые исполняются с перенаправления: такие вызовы перехватывают из канала STDIN команды, предназначенные интерпретатору.

Примечание 4: когда установлен флаг поддержки иероглифических языков (байт со смещением 3Ch в таблице A.07-1), тогда INT 21\AH=06h-08h могут

 

 

возвращать частично сформированные двухбайтовые коды.

8.02-05

INT 21\AH=09h – посылка строки знаков в канал STDOUT

При вызове:

 

 

AH

= 09h

 

DS:DX – указатель на начало строки, оканчивающейся знаком "$"

При возврате:

 

 

AL

= 24h (код знака "$", которым кончается строка)

Примечание 1: посылка знаков прекращается, как только будет встречен первый знак "$" (24h), причем сам знак "$" в канал не посылается.

Примечание 2: функция INT 21\AH=09h проверяет состояние флага, взводимого клавишными комбинациями CTRL-C и CTRL-Break (8.01-95). Если окажется, что этот флаг взведен, то будет вызван обработчик прерывания INT 23.

Примечание 3: послать строку знаков можно также посредством INT21\AH=40h (8.02-36).

– 387 –

Глава 8: Вызовы обработчиков прерываний

8.02-06 INT 21\AH=0Ah – буферированный ввод из канала STDIN

Когда канал STDIN не перенаправлен, обработчик прерывания INT 21\AH=0Ah ожидает нажатия клавиш, и после каждого нажатия записывает код клавиши в заранее подготовленный буфер. Если первоначально буфер был не пуст, то новые коды можно записывать после сохраняемого прежнего содержания. Записываемые коды знаков по мере их поступления копируются в канал STDOUT для отображения на экране. Запись прекращается при поступлении кода 0Dh в результате нажатия клавиши ENTER. Когда канал STDIN пересылает данные, перенаправленные из файла, то запись происходит безостановочно до тех пор, пока не будет встречен первый байт 0Dh. В любом случае запись прекращается, когда буфер оказывается заполнен.

При вызове:

AH = 0Ah

DS:DX – указатель на начало буфера, где заранее записаны 2 байта:

садреса 00h: полный размер буфера в байтах;

садреса 01h: с какого смещения записывать новые данные.

При возврате:

DS:DX – указатель на заполненный буфер, где 2 байта содержат:

садреса 00h: – полный размер буфера в байтах;

садреса 01h: – число фактически заполненных байтов.

Примечание 1: если первый байт буфера содержит код 00h, то обработчик прерывания INT 21\AH=0Ah не ждет нажатия клавиши, а сразу же возвращает управление вызывающей программе.

Примечание 2: счет записанных в буфер байтов начинается с байта 02h, причем в это число не входит байт 0Dh, которым кончается строка.

Примечание 3: функция INT 21\AH=0Ah проверяет состояние флага, взводимого клавишными комбинациями CTRL-C и CTRL-Break (8.01-95). Если окажется, что этот флаг взведен, то будет вызван обработчик прерывания INT 23.

Примечание 4: нельзя вызывать INT 21\AH=0Ah из командных файлов, которые исполняются с перенаправления: такие вызовы перехватывают из канала STDIN команды, предназначенные интерпретатору.

8.02-07 INT 21\AH=0Bh – определение статуса канала ввода

Обработчик прерывания INT 21\AH=0Bh не выполняет пересылку данных, а только позволяет определить, имеются ли в канале STDIN подлежащие пересылке данные. Если канал STDIN не перенаправлен, то результат показывает, пуст ли буфер клавиатуры. Если предполагается получать перенаправление из файла, то

– 388 –

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]