Assembler - язык неограниченных возможностей


Повторная входимость - часть 3


Пример вызова DOS из обработчика прерывания от внешнего устройства рассмотрен чуть ниже, в резидентных программах. А сейчас следует заметить, что функции BIOS, одну из которых мы вызывали в нашем примере timer.asm, также часто оказываются не повторно входимыми. В частности, этим отличаются обработчики программных прерываний 5, 8, 9, 0Bh, 0Ch, 0Dh, 0Eh, 10h, 13h, 14h, 16h, 17h. Так как BIOS не предоставляет какого-либо флага занятости, придется создать его самим:

int10_handler proc far inc cs:byte ptr int10_busy ; увеличить флаг занятости pushf ; передать управление старому ; обработчику INT 10h, call cs:dword ptr old_int10 ; эмулируя команду INT, dec cs:byte ptr int10_busy ; уменьшить флаг занятости iret int10_busy db 0 int10_handler endp

Теперь обработчики аппаратных прерываний могут пользоваться командой INT 10h, если флаг занятости int10_busy равен нулю, и это не приведет к ошибкам, если не найдется чужой обработчик прерывания, который тоже будет обращаться к INT 10h и не будет ничего знать о нашем флаге занятости.





Начало  Назад  Вперед