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



              

Возврат программы в DOS с сохранением ее резидентности - часть 10


    нижних адресах памяти заменяются новыми, используемыми в процедурах
    буферизации и вывода на печать. Обратите внимание на команду CLI,
    которая блокирует прерывания перед выполнением этой операции.
    Поскольку программа изменяет прерывание таймера, она не может
    допустить обработку его шага в этот момент времени. Если бы
    прерывание от таймера произошло в тот момент, когда программа
    изменила только одно из двух слов вектора прерываний от таймера, то
    микропроцессор продолжил бы выполнение с непредсказуемого адреса
    памяти. Разумнее запретить прерывания, чем допустить возможность
    перехода по неизвестному адресу.
 
      Прежде чем разблокировать прерывания, программа изменяет
    текущее значение счетчика таймера. Обычно прерывания от таймера
    происходят примерно 18 раз в секунду. Устройство печати может
    печатать по 80 символов в секунду. Если бы процедура вывода на
    печать выдавала по одному символу при каждом прерывании от таймера,
    то максимальная скорость печати составила бы 18 символов в секунду.
    Если ускорить таймер, прерывания от таймера будут происходить чаще.
    Это позволит программе выдавать на печать все 80 символов в
    секунду. В приведенном примере в таймер загружается значение
    счетчика 256, оно в 256 раз меньше стандартного значения.
    Компенсируется это увеличение скорости при помощи процедуры
    TIMER_HANDLER.
 
      Процедура инициализации возвращает управление в DOS при помощи
    прерывания INT 27H. Перед выходом из процедуры в регистр DX
    загружается указатель на байт, сразу следующий за последнм байтом
    всей программы. Заметим, что все процедуры и буфер печати мы
    расположили в пределах этой области памяти. В соответствии с
    правилами действия прерывания INT 27H DOS не затронет эту
    область.
 
      Приведенная программа зря расходует часть памяти.
    Инициализирующая ее часть выполняется только один раз, поэтому нет
    смысла оставлять ее в памяти. Можно оптимизировать программу



Содержание  Назад  Вперед