Что будет если где-то в программе оставить участок кода (реальный режим): cli xor cx, cx loop $ sti mov ax, 1234h mov bx, 5678hЗдесь показан небольшой цикл внутри cli/sti, в реальности он выполняется большее количество интеракций, по времени около 55 мс. Т.е. за это время пришел запрос с IRQ таймера. Собственно хотелось бы чтобы сразу после sti он обработался прерыванием int 8. Так ли будет? или он будет просто проигнорирован?
Проверил экспериментально, вроде бы да. (Вероятно за снятие статуса запроса отвечает отправка сигнала в соответствующий порт в штатном обработчике int 8.)
Administrator, IA vol 3A, 5.8.1: Это значит что прерывание ожидает обработки и будет доставлено как только выполниться sti.
Indy_, Вообще-то, это означает прямо противоположное. Если IF сброшен, все маскируемые прерывания игнорируются.
Indy_, Нет, там написано, когда инты размаскированы, они доставляются. Если упростить проц, то там двухвходовый AND, на один вход которого подключена нога процессора, а на второй - значение IF.
rmn, Ну тогда идите учите всю матчасть подробно, раз вы не понимаете как это работает. Инт удерживается(pending interrupt").
rmn, А зачем тогда пишите в тех. темах, котрых не понимаете(не важно почему - забыл(что маловероятно)/незнаю).
inhibits - означает купирование, в соответствии оксфордским словарём - снижения скорости доставки. Следовательно после снятия маски доставка возобновится. Тут про игнор ничего не сказано. Так что Indy_ прав. Однако если вы промедлите скажем более 165 мс то к вам доставится только 1 прерывание, а не 3 прерывания от таймера.
Pavia, Т.е., если я вызову cli, то прерывания будут где-то там накапливаться и потом придут мне всей пачкой?
Вы мыслите как программист, а надо мыслить как железячник. Они не приходят пачками. Прерывания накапливаются в регистре IRR контроллёра прерываний. А результат с этого регистра сливается в одну общую линии INTR которая подведена к ЦП. ЦП на каждой команде просто проверяет состояние линии INTR путём её опроса. Но проверку он делает через логический элемент and который маскирует реультат с этой линии либо нет. L_INTR := INTR and IF; Далее процессор либо видит 1 и прыгает на обработчик прерывания либо 0 тогда идёт на следующую команду. Пока вы не маскируете сигнал на линии при помощи логического элемента INTR and 1 вы будете попадать в прерывание. Когда процессор прыгает на прерывание он сам сбрасывает флаг IF. Тем самым заставляя INTR and IF выдавать 0. А по выходу из обработчика прерывания по команде ret восстанавливает значение флага. Так вот в компьютере несколько контролёров прерываний и у каждого свой IRR. Но там нет очереди только по 1 биту на каждый источник прерывания. У каждого источника свой приоритет. И пока вы вручную не очистите этот бит вы будете поступать на прерывание. У PIC очистка бита осуществляется путём посылки команды EOI. Обычно это делает обработчик прерывания. Если вы выкинете из обработчика посылку EOI то PIC будете всё время выдавать сигнал INTR, а процессор будет всё время обратно попадать в обработчик прерывания. Прим через одну команду, как при трассировки. Можно запрограммировать PIC на Auto EOI. Тогда накапливания не будет. Аналогичнм образом себя ведёт и Local APIC у него тоже есть регистр IRR.
Pavia, Это чётко описано, тс не считает нужным учить матчасть. IA vol 3A: Я уже это цитировал. В нт есть функция Kei386EoiHelper(), которая и завершает прерывания. Делая это естественно через iret: