Меню сайта

Урок 157. Системный сервис

Два драйвера в BIOS дают самый простойсистемный сервис. — Они
— — — предназначены для определения объемапамяти ЭВМ и конфигурации
— — — внешних устройств.

— — — — — Программа определения объема памяти неимеет параметров. BIOS
— — — возвращает в регистре AX объем памятисистемы, измеренный в
— — — килобайтах (1024 байт). Если система имеетпамять 64K байт, в
— — — регистре AX возвратится число 64. Любаяпрограмма, использующая всю
— — — память системы, должна запрашивать у BIOSобъем памяти, чтобы
— — — определить, где находится ее конец.Программа могла бы определить
— — — объем памяти, записав и прочитав подрядячейки памяти, сравнивая
— — — записанное и прочитанное значение. Но, какпокажет пример в
— — — следующей главе, важно писать всеприкладные программы так, чтобы
— — — они использовали для определения объемапамяти подпрограмму,
— — — возвращающую этот объем. Изменяя значениеверхнего предела памяти,
— — — можно зарезервировать участок в верхнихадресах памяти. После того,
— — — как программа изменит значение общегообъема памяти, корректно
— — — написанная прикладная программа не нарушитграницу памяти.

— — — — — Программа проверки конфигурации внешнихустройств не имеет
— — — входных параметров. Эта программавозвращает в регистре AX
— — — 16-битовый код, показывающий, какиеустройства подключены к
— — — конкретной системе. В прологе распечаткиэтой программы в
— — — техническом руководстве по IBM PCуказывается, что означает каждый
— — — бит. Эта функция BIOS — простейший способопределения, существует
— — — ли конкретное устройство в системе, илинет.

— — — — — Последняя системная сервисная программапроверяет время суток.
— — — У этой программы есть две функции: чтениевремени и установка
— — — времени. Время измеряется в квантахтаймера, начиная с того
— — — момента, когда машина включается, иотсчитывается от полуночи. BIOS
— — — не преобразует это значение в часы, минутыи секунды. Но в листинге
— — — BIOS показаны нужные для преобразованияконстанты. Чтобы определить
— — — время в часах, разделите 24-битовоезначение таймера на 65543,
— — — число квантов таймера в часе. Чтобыопределить минуты, разделите
— — — остаток от предыдущего деления на 1092,количество квантов в
— — — минуте, и так далее.

— — — — — Если точность преобразования значениявремени не очень критична
— — — для вас, можно воспользоваться болеепростым методом. Так как
— — — количество квантов, соответствующее 24часам не помещается в одно
— — — слово, значение таймера представляетсятрехбайтовым целым числом.
— — — Значение старшего байта отличается неболее, чем на 1% от времени в
— — — часах. Младшее слово можно разделить на1092, чтобы определить
— — — число минут, а деление остатка на 18 даетчисло секунд.

— — — — — Функция времени дня использует аппаратноепрерывание,
— — -прерывание по кванту таймера. Это прерывание имеет уровень 0 в
— — — контроллере прерываний 8259, и имеетвектор прерывания 8 в
— — — микропроцессоре 8088. Эта программаполучает управление каждые 55
— — — миллисекунд. Основное назначение этойпрограммы — увеличение
— — — счетчика квантов таймера программы временидня. Если программа
— — — выключит прерывания на значительныйпромежуток времени, то весьма
— — — вероятно, что время суток перестанет бытьправильным.

— — — — — Прерывание от таймера используется такжепрограммой
— — — обслуживания дисковода. Двигателидисковода включены не постоянно-
— — — BIOS включает двигатели только на времядоступа к дискете. Но BIOS
— — — не выключает двигатель сразу же послевыполнения операции. Есть
— — — некоторый интервал времени междувключением двигателя и тем
— — — моментом, когда он разгонится и будетвращаться достаточно быстро,
— — — для того, чтобы можно было читать данные.Если программа обращается
— — — к дисководу почти сразу после предыдущегообращения, лучше оставить
— — — двигатель включенным, а не выключать ивключать его. Программа
— — — обработки аппаратного прерывания оттаймера учитывает это.
— — — Обработчик дискового прерывания загружаетчисло в переменную,
— — — которая называется MOTOR_COUNT, когда
завершается операция обмена с
— — — дискеттой. Прерывание от таймера уменьшаетзначение этого счетчика.
— — — Когда значение переменной MOTOR_COUNTдостигает 0, выключается
— — — двигатель дисковода. Программаобслуживания дисковода проверяет
— — — этот счетчик, перед обращением к дискете.Если двигатель еще не
— — — включен, нужна задержка, пока двигатель неразгонится. Обычно
— — — двигатель дисковода продолжает работатьдве секунды после
— — — завершения предыдущей операции. Это время- один из параметров
— — — дисковода, и вы можете изменить егозначение. Выбор этого значения
— — — поддерживает балланс между повышениемпроизводительности и
— — — снижением износа поверхности дискеты.

— — — — — Все эти три сервисные программы BIOSпередают числа из ячеек
— — — памяти в вызывающую программу. Можноизбежать использования BIOS
— — — путем непосредственного чтения этих ячеек.Но зачастую проще
— — — вызвать BIOS, чем организовывать адресациюк сегменту DATA
— — — используемому в BIOS. С»наивной» точки зрения, проще использовать
— — — программу BIOS.

Категория: Программирование на Ассемблере | Дата: 03.03.13

Меню раздела
Блок