STI

Juego Bandera Interrupt

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
FBSTIZOValidoValidoEstablecer bandera interrumpida; interrupciones externas y enmascarables habilitadas al final de la siguiente instrucción.

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

Descripción

En la mayoría de los casos, STI establece la bandera de interrupción (IF) en el registro EFLAGS. Esto permite al procesador responder a interrupciones de hardware enmascarables.

Si IF = 0, las interrupciones de hardware enmascarables permanecen inhibidas en el límite de instrucción después de una ejecución de STI. (El efecto retardado de esta instrucción se proporciona para permitir que las interrupciones estén habilitadas justo antes de regresar de un procedimiento o de una subrutina. Por ejemplo, si una instrucción STI es seguida por una instrucción RET, la instrucción RET se permite ejecutar antes de que se reconozcan interrupciones externas. No se pueden reconocer interrupciones si una ejecución de CLI inmediatamente sigue tal ejecución de STI.) La inhibición termina después de la entrega de otro evento (por ejemplo, excepción) o la ejecución de la siguiente instrucción.

La bandera de la IF y las instrucciones de STI y CLI no prohíben la generación de excepciones y interrupciones no visibles (NMIs). Sin embargo, los NMI (y las interrupciones de la gestión del sistema) pueden ser inhibidos en el límite de instrucción después de una ejecución de STI que comienza con IF = 0.

La operación es diferente en dos modos definidos como sigue:

Si IOPL < 3, EFLAGS.VIP = 1, y el modo VME o el modo PVI es activo, STI establece la bandera VIF en el registro EFLAGS, dejando IF no afectada.

La tabla 4-22 indica la acción de la instrucción STI dependiendo del modo de operación del procesador, IOPL, CPL y EFLAGS.VIP.

Tabla de decisión para los resultados de STI

ModoIOPLEFLAGS.VIPResultado STI
l-addressX1XIF = 1
, no PVI2CPLXIF = 1
< CPLXFallo #GP
3XIF = 1

Operación

IF CR0.PE = 0 (* Executing in real-address mode *)
    THEN IF := 1; (* Set Interrupt Flag *)
    ELSE
          IF IOPL  CPL (* CPL = 3 if EFLAGS.VM = 1 *)
                THEN IF := 1; (* Set Interrupt Flag *)
                ELSE
                      IF VME mode OR PVI mode
                            THEN
                                  IF EFLAGS.VIP = 0
                                        THEN VIF := 1; (* Set Virtual Interrupt Flag *)
                                        ELSE #GP(0);
                                  FI;
                            ELSE #GP(0);
                      FI;
          FI;

FI;

Banderas afectadas

O la bandera IF o la bandera VIF se establece a 1. Otras banderas no son afectadas.

Excepciones

Modo protegido
#GP(0)Si CPL es mayor que el modo IOPL y PVI no es activo. Si CPL es mayor que IOPL y EFLAGS.VIP = 1.
#UDSi se utiliza el prefijo LOCK.
Modo real
#UDSi se utiliza el prefijo LOCK.
Modo virtual-8086
#GP(0)Si IOPL es menos de 3 y el modo VME no es activo. Si IOPL es menos de 3 y EFLAGS.VIP = 1.
#UDSi se utiliza el prefijo LOCK.
Modo de compatibilidad
Las mismas excepciones que en modo protegido.
Modo de 64 bits
Las mismas excepciones que en modo protegido.

Fuentes