pop dx
ret
more_digit:
shl ax,cl ; открытие места для следующей цифры
jmp nxt_digit ; цикл для следующей цифры
bad_digit:
@DisStr digit_error ; информирование об ошибке элемента
stc ; ошибка - установка переноса
pop cx
pop dx
ret
; ожидался двухцифровой шестнадцатиричный номер
digit_error db 'A two-digit hex number was expected',CR,LF,'$'
get_hex ENDP
;
; ===== BIN2HEX отображает значение, содержащееся в AX как =====
; ===== шестнадцатиричный #. Регистры не портятся. CH содержит =
; ===== # цифры для отображения, выбираемой слева направо в AX.=
; ===== (AH отображается, если CH равен 2). ====================
;
bin2hex PROC NEAR
- 3-72 -
push ax ; сохранение всех регистров
push bx
push cx
push dx
mov cl,4 ; установка счетчика чередования
mov bx,ax ; копирование AX для работы
; Начало цикла DIGIT (цифра) для обработки цифр
moredig:
rol bx,cl ; преобразование двоичн.-шестнадцат.
mov al,bl
and al,0Fh
add al,90h
daa
adc al,40h
daa
; Отображение цифры и проверка на последующие цифры - восста-
; новление, если нет
@DisChr al
dec ch
jnz moredig
pop dx
pop cx
pop bx
pop ax
ret
bin2hex ENDP
;
remove ENDS
END start
----------------------------------------------------------------
Эта секция, отображающая содержимое адресуемого размещения с
помощью вектора, может быть выбрана и превращена в программу.
Эта программа может быть использована для отображения содержимо-
го любого вектора прерывания и его возможных подпрограмм обслу-
живания.
Программа REMOVE служит примером для многих тем, обсужденных
в этой главе, и помогает при демонстрации рекомендуемого инстру-
ментария установки и удаления.
Заключение
Материал, представленный в этой главе, касается многих от-
дельных тем. Дополнительно к обещанному материалу по управлению
программами и памятью в эту главу был также включен материал по
организации программ, а также по структуре и содержимому прог-
рамм MS-DOS. Было дано множество примеров способов функциониро-
вания макроассемблера (MASM) MS-DOS.
Несмотря на то, что показанный здесь материал, не всегда мо-
жет оказаться для Вас полезным, мы надеемся, что Вы найдете при-
ложение многому из того, что изложено в этой главе. Для систем-
ных и прикладных программистов особенно важным является материал
по PSP и организации программ в памяти.
Глава 4. ПРОГРАММЫ TSR (ЗАВЕРШИТЬ И ОСТАВИТЬ РЕЗИДЕНТНОЙ)
Обзор
Работа с аппаратурой PC
Работа в среде DOS
Загрузка и инициализация TSR
Реактивация, архитектура DOS и сервис
Фоновая обработка с использованием Int 28h
Удаление из памяти программ TSR
Заключение
Создание и установка резидентных программ (TSR) является ши-
роко используемым средством, но его функционирование остается
скрытым от большинства пользователей. Архитектура MS-DOS и аппа-
ратные средства PC налагают ограничения на возможности TSR и ус-
ловия их осуществления. Некоторые из этих ограничений проявляются
только тогда, когда TSR выводятся на экран или запрашивают базо-
вую систему ввода-вывода (BIOS) с прерыванием программ обслужива-
ния; другие требуют внимания при установке TSR.
Эта глава описывает работу TSR. Вы будете ознакомлены с об-
служиванием (документированным и нет), которое обеспечивает DOS,
и со взаимодействием TSR с DOS. Вы будете также ознакомлены с
несколькими техническими решениями автора относительно TSR. Но
вначале несколько слов предупреждения.
Многие материалы, использованные в этом описании не докумен-
тированы, а получены реассемблированием PC-DOS версии 3.10. Мно-
гие обсуждаемые здесь программы не доступны в версиях PC-DOS ниже
3.00, и нет гарантий, что они будут представлены в следующих вер-
сиях DOS. Многие особенности характерны для программного обеспе-
чения PC-DOS 3.10, которое их использует, и не могут быть перене-
сены в другие выпуски DOS, но могут быть использованы в будущем.
Это делает возможным конфликты между различными существующи-
ми TSR (включая представленные здесь примеры). Степень этих конф-
ликтов может находиться в диапазоне от досадных до катастрофичес-
ких. Наиболее серьезные из них могут привести к потере данных или
порче диска.
Дополнительно в этой главе описывается программирование
контроллера CRT 6845, который поддеpживает монохромный и цветной
дисплейные адаптеры (MDA и CGA). Ошибки в программировании этого
устройства могут привести к серьезному повреждению Вашей системы.
Обзор
Резидентные программы становятся повсеместными. Они доступны
как коммерческие программы, совместно используемые средства и да-
же как часть MS-DOS. Sidekick (боковой удар) Борланда является,
вероятно, наиболее известным коммерческим предложением. Команды
PRINT и ASSIGN и несколько других утилит DOS также являются рези-
дентными.
Все резидентные программы начинают жизнь, как обычные прог-
раммы. После выполнения такой программы часть ее кода остается в
памяти. Код, который выполняется при первом обращении, называется
кодом инициализации, а тот, который остается после, известен как
резидентный код. Основной задачей кода инициализации является
подготовка резидентного кода для дальнейшего использования. Воз-
можности кода инициализации не ограничены, но программирование
- 4-2 -
резидентного кода может быть сложным.
Резидентные программы могут быть сгруппированы в три катего-
рии на основе того, что их резидентный код делает. Члены первой
группы не обеспечивают взаимодействия пользователя с их резидент-
ной частью. Однажды загруженные, они остаются фоновыми, выполняя
свои задачи без обращения к базовой системе ввода-вывода
(BIOS).Команда DOS ASSIGN является одним из таких резидентов; ее
резидентная часть обеспечивает доступ и переназначает запрошенный
диск с одного драйвера на другой. Подробное документирование и
многочисленные примеры делают написание этого типа резидентных
программ несложной задачей.
Члены второй группы резидентных программ остаются приоста-
новленными до выдачи специального запроса пользователя. Обычно
этот запрос производиться нажатием функциональной клавиши или
комбинацией функциональной клавиши с другими (например,
Alt-Shift), причем функциональная клавиша нажимается последней. С
другой стороны, их резидентный код не делает запросов к базовой
системе ввода-вывода; они должны обслуживаться командами DOS, та-
кими, как чтение и запись, только во время инициализации.
Небольшая резидентная телефонная база данных попадает в эту
группу. Код инициализации считывает полное ее оглавление в па-
мять. В ответ на нажатие функциональной клавиши резидентный код
должен сохранить текущий экран, получить одно или больше имен,
найти ассоциированные с ними номера телефонов и отобразить ре-
зультаты поиска. Когда имен больше нет, резидент должен восстано-
вить начальный экран и выключиться.
Обслуживание, необходимое для таких TSR, достаточно хорошо
документировано, но есть несколько технических решений относи-
тельно распределения используемых клавиш и связи с аппаратными
средствами отображения.
Последняя группа резидентных программ осуществляет асинхрон-
ные запросы к базовой системе ввода-вывода. Эти программы запус-
каются нажатием функциональной клавиши или каким-либо другим
программным прерыванием от аппаратных средств, (например, тайме-
ром). Этот резидентный код не обязательно имеет связь с пользова-
телем. К этой категории относится утилита DOS PRINT. Эти рези-
дентные программы трудны для написания, потому что DOS в основном
является однопользовательской/однопрограммной системой. Майкро-
софт имеет средство отладки для таких программ, но оно не доку-
ментировано и для правильного использования требует нестандартных
соглашений DOS .
Перед тем, как начать писать резидентную программу, Вам бу-
дет нужна некоторая дополнительная информация. Например, для под-
держки "горячих" функциональных клавиш, Вы должны знать,как рабо-
тает клавиатура и дисплей. Или,например, архитектура программного
обеспечения DOS налагает некоторые реальные ограничения на то,
что могут делать резидентные программы; Вы должны знать о работа-
ющих в версии DOS модулях, которые воздействуют на TSR. Раз Вы
понимаете работу аппаратуры и механизм операционной системы, Вы
должны быть готовы изучить, что TSR требует при своей инициализа-
ции и реактивации. И, наконец, Вы узнаете,как писать TSR, которая
выполняется в фоновом разделе.
Работа с аппаратурой PC
Клавиатура, таймер и некоторые другие устройства при обраще-
нии к процессору генерируют прерывания. Системы PC/XT поддержива-
- 4-3 -
ют восемь различных программных прерываний,а системы AT - больше.
Многие из этих прерываний относятся к драйверам устройств, и TSR
не должны взаимодействовать с ними.Из всех программных прерываний
TSR взаимодействует только с прерываниями от таймера и клавиату-
ры.
Часть обращений к резидентным программам осуществляется
пользователем при работе с "горячими" ключами. Одним нажатием
клавиши можно вызвать TSR и запросить выполнение какой-либо ее
функции. Если программа написана грамотно, она сразу включается,
выполняет свою работу и уходит в фоновый раздел без повреждения
или разрушения других программ. Осуществление запросов через го-
рячие ключи требует небольшой работы и хорошего понимания, как
функционируют дисплей и клавиатура.
Некоторые резидентные программы должны выполнять свои задачи
через точно заданные периоды. Каждый персональный компьютер имеет