|
Следующий пример демонстрирует фрагмент кода, который
сохраняет блок запроса, используя описанную методику :
mov cs:word ptr [req_ptr],bx
mov cs:word ptr [req_ptr + 2],es
Однако, как только MS-DOS станет многозадачной, сохранение
только указателя на блок запроса будет уже недопустимо. В этом
случае программа СТРАТЕГИЙ должна будет не только сохранять сам
блок запроса но и, возможно, помещать блоки запросов в очередь
(если, конечно, эту функцию не возьмет на себя MS-DOS). Впрочем,
до тех пока этого не случилось, мы можем пользоваться более прос-
тым способом сохранения адреса блока.
Как программа ПРЕРЫВАНИЙ так и программа СТРАТЕГИЙ должны быть
определены в драйвере как FAR процедуры, возвращая управление
MS-DOS, соответственно, командой RETF. В связи с тем, что MS-DOS
вызывает эти подпрограммы с помощью команды CALL типа FAR, любая
иная команда возврата приведет либо к передаче управления по не-
верному адресу (RETN) либо к порче стека (IRET).
Программа ПРЕРЫВАНИЙ
После того, как программа СТРАТЕГИЙ сохраняет указатель на
блок запроса и возвращает управление, MS-DOS вызывает программу
ПРЕРЫВАНИЙ (называемую также точкой входа запроса в документации
фирмы IBM по PC DOS). Собственно запрос к драйверу обрабатывается
именно этой программой.
Самое первое действие, которое должна выполнить программа ПРЕ-
РЫВАНИЙ - это сохранить все регистры. На момент обращения к драй-
веру устройства стек имеет емкость примерно в 20 слов. Сохранение
всех регистров, включая флаги, требует 14 слов. Если программе
ПРЕРЫВАНИЙ требуется для работы более чем 6 слов стека, она долж-
на установить свой собственный локальный стек.
После сохранения текущего состояния процессора, программа ПРЕ-
РЫВАНИЙ должна получить блок запроса, сохраненный программой
СТРАТЕГИЙ. Если адрес этого блока был сохранен с помощью приве-
денных выше команд, то получить адрес блока параметров можно ко-
мандой LDS
lds bx,cs:[req_ptr] ; получить адрес блока запроса
Теперь, получив доступ к заголовку блока запроса, можно начи-
нать его обработку. Первый шаг заключается в анализе запроса.
Доступ к нужным полям блока запроса будет значительно облегчен,
если описана структура заголовка.
|