Поясним особенности выполнения этих команд на конкретных примерах. Поскольку поле IOPL находится не в дескрипторе, а в более доступном регистре FLAGS, может показаться, что способ защиты ввода-вывода проработан не очень хорошо. Предположим, что прикладная программа безуспешно попыталась выполнить команду ввода-вывода. Тогда можно записать копию регистра EFLAGS в стек, преобразовать его как любой операнд в памяти, а затем извлечь из стека модифицированный образ в регистр флагов:
Однако такой прием в МП iх86 не работает из-за особенностей выполнения команд POPFD и POPF. Примерно такая же ситуация характерна для модификации флага прерываний IF. Команды сброса CLI и установки STI этого флага являются IOPL-чувствительными. Если оказалось, что прямое их выполнение невозможно, можно попытаться аналогичным способом воздействовать на флажок IF регистра EFLAGS:
Но это тоже не проходит. Команда popfd просто не изменит ни IOPL, ни IF. |