logo

Система команд x86
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

CLI

Запретить внешние прерывания

Влияние команды на флаги и форматы команды:

OF

DF

IF

TF

SF

ZF

AF

PF

CF

   

0

           

 

Код

Команда

Описание

Проц.

Пример

FA

CLI

Сброс флага EFLAGS.IF (внешние маскируемые прерывания запрещены)

8086

cli

Операция:

IF CR0.PE = 0 (* Выполняется в режиме реальной адресации *)

   THEN EFLAGS.IF = 0;

   ELSE

      IF EFLAGS.VM = 0 (* Выполняется в защищенном режиме *)

         THEN

            IF EFLAGS.IOPL = 3

               THEN EFLAGS.IF = 0;

               ELSE

                  IF CPL ≤ EFLAGS.IOPL

                     THEN EFLAGS.IF = 0;

                     ELSE (* CPL > EFLAGS.IOPL *)

                        IF (CPL = 3 and CR4.PVI = 1)

                           THEN EFLAGS.VIF = 0;

                           ELSE #GP(0);

                        FI;

                  FI;

            FI;

         ELSE (* Выполняется в виртуальном-8086 режиме *)

            IF EFLAGS.IOPL = 3

               THEN EFLAGS.IF = 0;

               ELSE

                  IF CR4.VME = 1

                     THEN EFLAGS.VIF = 0;

                     ELSE #GP(0);

                  FI;

            FI;

      FI;

FI;

Описание:

Команда CLI очищает флаг EFLAGS.IF. Сброс флага EFLAGS.IF означает, что после команды CLI и до точки повторной установки флага микропроцессор прекращает воспринимать (распознавать) и реагировать на запросы прерывания по входу INTR# (внешние маскируемые прерывания). Никакие другие флаги командой CLI не изменяются.

В реальном режиме команда срабатывает без всяких условий и не может привести к генерации особых ситуаций.

В защищенном режиме флаг EFLAGS.IF сбрасывается, только если текущий уровень привилегий как минимум такой же, как и уровень привилегий ввода/вывода (CPL ≤ EFLAGS.IOPL), в противном случае команда вызывает генерацию ошибки общей защиты (#GP). Такое поведение называется IOPL-чувствительностью и в защищенном режиме оно характерно также для команд STIIN, OUTINS/NSB/INSW/INSD, OUTS/OUTSB/OUTSW/OUTSD.

В режиме V86 успешное срабатывание команды CLI (с учетом того что в задачах этого режима всегда CPL = 3) возможно только тогда, когда EFLAFS.IOPL = 3. В противном случае также генерируется ошибка общей защиты (#GP). В этом режиме IOPL-чувствительностью обладают также команды STI, POPF/POPFD, PUSHF/PUSHFD, IRET/IRETDINT n.

В процессорах, начиная с Pentium, поддерживаются специальные расширенные режимы обработки прерываний (виртуальные прерывания). Это позволяет обеспечить нормальное выполнение старого ПО, использующего команды управления внешними маскируемыми прерываниями (векторы от 32 до 255), в современной мультипроцессорной и мультизадачной программно-аппаратной среде. Указанные режимы управляются флагами CR4.PVI и CR4.VME и включают:

 

В этих режимах флаг виртуального прерывания EFLAGS.VIF выступает виртуальным подобием флага EFLAGS.IF. При условии, что виртуальные прерывания инициализированы (CR4.PVI = 1 в защищенном режиме, CR4.VME = 1 в режиме V86), команда CLI (как и команда STI), выполняемая при текущем уровне привилегий равном 3 (CPL = 3), при соблюдении условия EFLAGS.IOPL < 3 не вызывает генерацию ошибки общей защиты (#GP), а оказывает влияние на флаг EFLAGS.VIF, оставляя флаг EFLAGS.IF неизменным. Аналогичный специальный функционал для режима EV86 имеют также команды PUSHF, POPF, STI, IRET и команда вызова программных прерываний INT n.

Таблица событий 6.24. указывает — какое действие из нижней части таблицы произойдет при условиях, стоящих в верхней части.

Таблица 6.24. Действия команды CLI и условия их выполнения

CR0.PE

0

1

1

1

1

1

1

1

EFLAGS.VM

x

0

0

0

0

1

1

x

CR4.PVI

x

x

0

1

1

x

x

x

CR4.VME

x

x

x

x

x

0

1

x

CPL

x

≤ IOPL

> IOPL

3

< 3

x

x

x

EFLAGS.IOPL

x

≥ CPL

< CPL

< 3

< CPL

< 3

< 3

3

EFLAGS.IF = 0

+

+

         

+

EFLAGS.VIF = 0

     

+

   

+

 

#GP(0)

   

+

 

+

+

   

Особые ситуации защищенного режима:

#GP(0), если текущий уровень привилегий по значению больше (имеет меньше привилегий), чем уровень привилегий ввода/вывода – CPL > EFLAGS.IOPL (кроме режима с поддержкой виртуальных прерываний).

Intel386 … :
#UD при использовании префикса LOCK.

Pentium … (в режиме с поддержкой виртуальных прерываний – CR4.PVI = 1):
#GP(0) при активном режиме с поддержкой виртуальных прерываний (CR4.PVI = 1), если текущий уровень привилегий меньше 3 и больше чем уровень привилегий ввода/вывода (EFLAGS.IOPL < CPL < 3).

Особые ситуации режима реальной адресации:

Intel386 … :
#UD при использовании префикса LOCK.

Особые ситуации режима V86:

#GP(0), если не активирован режим EV86 (CR4.VME = 0), а также уровень привилегий ввода/вывода по значению меньше 3 (EFLAGS.IOPL < 3).

Intel386 … :
#UD при использовании префикса LOCK.


Входит в группу команд: Базовая система команд CPU



Все права защищены © 1997-2011 Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Яндекс.Метрика               Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники