[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Как справедливо заметил уважаемый ValterG, "RETI чего-то с прерываниями делает, чтобы не было повторного"; только не академик, заметим мы от себя, вспоминая BLACKEAGLE'а, а футболист: не RETI это делает, а переход на прерывание. На это справедливо указал уважаемый Kuka: "Нужно обязательно сделать IRET, иначе прерывания будут запрещены". Только не Амбарцумян, продолжаем мы свою мысль, а Акопян: не все прерывания будут блокированы, а только равные и низшие по уровню приоритета. И вернуться из этого состояния у нас нет другой возможности, кроме как выполнить команду RETI или аппаратный RESET, зато уж этого достаточно. Поэтому мы не можем согласиться с замечанием уважаемого Игоря А.: "Команда RET также возвращает управление
основной программе, но при этом не снимает
блокировку прерываний, что приводит к
необходимости иметь ПРОГРАММНЫЙ
МЕХАНИЗМ АНАЛИЗА ОКОНЧАНИЯ
ПРОЦЕДУРЫ ОБСЛУЖИВАНИЯ ПРЕРЫВАНИЯ". Видимо, книжка Игоря не имеет отношения к пятьдесят первым. В 51-х нет такой программной возможности.
Однако попасть из обработчика прерываний в произвольное место программы можно, для этого существует УЛОВКА ФИЛИПСА. Выглядит это примерно так:
'обработчик прерываний
:here_it_begins
'обработка
........
'выход
acall durka
dec SP
dec SP
ljmp WHERE_YOU_WANT
durka:
RETI
'и больше уже ничего не надо
Идея здесь в том, что возврат из подпрограммы durka происходит не командой RET, как у приличных людей, а командой RETI, которая одновременно сбрасывает недоступный программно флаг обработки прерывания. Эта уловка мною проверена в рабочих проектах.
С уважением,
Михасик.
E-mail: info@telesys.ru