操作碼 |
指令 |
說明 |
FB |
STI |
設定中斷標誌;下一個指令結束時啟用可遮蔽的外部中斷 |
設定 EFLAGS 暫存器中的中斷標誌 (IF)。設定 IF 標誌設定之後,處理器在執行下一個指令之後,開始響應可遮蔽的外部中斷。此指令提供延遲效果目的在於,使得可以在從過程(或子例程)返回之前啟用中斷。例如,如果 STI 指令後跟 RET 指令,則可以在識別外部中斷之前執行 RET 指令。此行為可用於在過程開始時禁用外部中斷,在過程結束時再次啟用外部中斷。如果 STI 指令後跟 CLI 指令(清除 IF 標誌),則 STI 指令的效果相反。
IF 標誌、STI 以及 CLI 指令不影響異常與 NMI 中斷的產生。
以下決策表指示根據處理器的操作模式,以及目前執行的程式或過程的 CPL 與 IOPL(表格底部),STI 指令執行的操作(表格頂部)。
PE = |
0 |
1 |
1 |
1 |
VM = |
X |
0 |
0 |
1 |
CPL |
X |
IOPL |
> IOPL |
=3 |
IOPL |
X |
X |
X |
=3 |
IF 1 |
Y |
Y |
N |
Y |
#GP(0) |
N |
N |
Y |
N |
備註:X 表示無意義。N 表示不執行第 1 列的操作。Y 表示執行第 1 列的操作。
IF PE=0 (* Executing in real-address mode *)
THEN
IF 1; (* Set Interrupt Flag *)
ELSE (* Executing in protected mode or virtual-8086 mode *)
IF VM=0 (* Executing in protected mode*)
THEN
IF IOPL 3
THEN
IF 1;
ELSE
IF CPL IOPL
THEN
IF 1;
ELSE
#GP(0);
FI;
FI;
ELSE (* Executing in Virtual-8086 mode *)
#GP(0); (* Trap to virtual-8086 monitor *)
FI;
FI;
IF 標誌設定為 1。
#GP(0) - 如果 CPL 大於(特權更小)目前程式或過程的 IOPL。
無。
#GP(0) - 如果 CPL 大於(特權更小)目前程式或過程的 IOPL。