Хотя процессор не накладывает фундаментальных ограничений на вложенные прерывания, службы MS-DOS и BIOS не допускают повторного входа. То есть, как правило, их небезопасно вызывать во время аппаратного прерывания, поскольку прерывание может произойти, когда ЦП уже выполняет функции MS-DOS или BIOS.
Чтобы использовать службы MS-DOS и BIOS из подпрограммы обслуживания аппаратных прерываний, можно предпринять ряд шагов, чтобы обеспечить их безопасное использование. То, что вам нужно сделать, довольно сложно, среди прочего вам нужно отслеживать флаг InDos и перехватывать другие прерывания, поэтому я просто укажу вам на раздел о повторном входе в книге Искусство программирования на языке ассемблера. Он неплохо справляется со всеми деталями.
Вот выдержка из этого раздела. Это лишь часть того, что вам может понадобиться сделать:
MS-DOS предоставляет специальный однобайтовый флаг (InDOS), который содержит ноль, если DOS в данный момент активен, и ненулевое значение, если DOS уже обрабатывает запрос приложения. Проверив флаг InDOS, ваш TSR может определить, может ли он безопасно выполнить вызов DOS. Если этот флаг равен нулю, вы всегда можете сделать вызов DOS. Если этот флаг содержит один, вы не сможете выполнить вызов DOS. MS-DOS предоставляет вызов функции Get InDOS Flag Address, который возвращает адрес флага InDOS. Чтобы использовать эту функцию, загрузите ah с 34h и вызовите DOS. DOS вернет адрес флага InDOS в es:bx. Если вы сохраните этот адрес, ваши резидентные программы смогут проверить флаг InDOS, чтобы увидеть, активен ли DOS.
На самом деле есть два флага, которые вы должны проверить: флаг InDOS и флаг критической ошибки (criterr). Оба этих флага должны содержать ноль, прежде чем вы вызовете DOS из TSR. В DOS версии 3.1 и более поздних версиях флаг критической ошибки появляется в байте непосредственно перед флагом InDOS.
Так что же делать, если эти флаги не равны нулю? Достаточно просто сказать: «Эй, вернись и займись этим позже, когда MS-DOS вернется к пользовательской программе». Но как это сделать? Например, если прерывание клавиатуры активирует ваш TSR, и вы передаете управление реальному обработчику клавиатуры, потому что DOS занята, вы не можете ожидать, что ваш TSR будет волшебным образом перезапущен позже, когда DOS перестанет быть активным.
Хитрость заключается в том, чтобы подключить ваш TSR к прерыванию таймера, а также к прерыванию клавиатуры. [...]
person
Ross Ridge
schedule
30.08.2014