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


         

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


    сохраненного вектора прерываний печати. Можно было бы обратиться к
    листингу BIOS, приведенному в техническом справочнике, и найти
    начальный адрес процедуры печати. Затем включить этот адрес
    непосредственно в код программы так же, как это делается для других
    абсолютных адресов. Однако в результате программа оказалась бы
    жестко к этому адресу в системе BIOS. Если фирма IBM изменит
    процедуры BIOS и, таким образом, - адрес процедуры печати, то
    рассмотренная программа не сможет больше работать. Конечно, если
    пишите эту программу для своей собственной машины, а покупать новую
    или продавать свою программу не собираетесь, то указанных проблем
    не возникнет. Однако в общем случае надо избегать использования
    абсолютных адресов, если есть выбор. В приведенном примере
    процедура инициализации легко может использовать вектор
    прерываний печати для определения адреса процедуры печати
    BIOS в ПЗУ.
 
      В оставшейся части процедуры PRINT_HANDLER символ помещается в
    буфер печати. Перед тем, как поместить символ программа проверяет,
    есть ли в буфере место. Если буфер полон, программа ждет, пока
    освободится место. Это ожидание не вызовет проблем, поскольку и
    стандартная процедура BIOS ждет, чтобы принтер был готов принять
    символ. Из соображений безопасности в регистре CX накапливается
    число проходов по ветви "занято". Если это число становится равным
    64K, а буфер по-прежнему полон, то это может означать какой-то
    сбой. В этом случае процедура PRINT_HANDLER так же, как и BIOS,
    выдает сообщение о превышении допустимого времени ожидания.
 
      В приведенном примере процедура печати использует также
    внутреннюю процедуру ADVANCE_POINTER. Эта несложная процедура
    делает буфер печати циклическим. Если указатель сдвигается за
    пределы буфера, подпрограмма переносит его на начало буфера. Она
    аналогична процедуре BIOS для буфера клавиатуры. Только в данном
    случае в буфер помещается 10000 символов, а не 16.



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