Assembler для начинающих






    Два драйвера в 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.