| POPF |
| Четене на флаговия регистър от стека |
| Обща форма: |
POPF |
| Форма |
КОП |
CPUID |
I8086 |
I80386 |
I80486 |
| 16 |
32 |
64 |
Alt |
|
I8086 |
I80386 |
I80486 |
| POPF |
9D |
9D |
9D |
48 EF |
|
|
18 |
11 |
| POPFW |
9D |
66 9D |
66 9D |
[F1] 48 EF |
|
|
18 |
11 |
| POPFD |
66 9D |
9D |
|
[F2] 48 EF |
|
|
18 |
11 |
| POPFQ |
|
|
48 9D |
[F3] 48 EF |
|
|
18 |
11 |
|
| Действие |
temp ← pop()
temp.VM ← EFLAGS.VM /* POPF не променя VM */
IF CPL > 0 THEN
temp.IOPL ← EFLAGS.IOPL /* IOPL се променя само ако CPL=0 */
ENDIF
CASE режим на работа OF
VM = 1, VME = 1, IOPL < 3:
temp.VIF ← temp.IF
temp.IF ← EFLAGS.IF
VM = 1, VME = 0, IOPL < 3:
#GP(0)
VM = 0, PVI = 1, IOPL < 3, CPL = 3:
temp.VIF ← temp.IF
temp.IF ← EFLAGS.IF
ELSE
IF CPL > IOPL
temp.IF ← EFLAGS.IF /* IF се променя ако CPL ≤ IOPL */
ENDIF
END CASE
EFLAGS ← temp
IF EFLAGS.VIF = 1 AND EFLAGS.VIP = 1 THEN
#GP(0) /* Грешка спрямо следващата инструкция! */
ENDIF
|
| Флагове |
| PE |
VM |
NT |
IOPL |
OF |
DF |
IF |
TF |
SF |
ZF |
AF |
PF |
CF |
| T |
T |
R |
TR— |
R |
R |
R— |
R |
R |
R |
R |
R |
R |
|
| Забележки |
- IOPL се променя само ако CPL = 0;
- IF се променя ако CPL ≤ IOPL;
- Ако са разрешени виртуалните прекъсвания (VM = 1, CR4.VME = 1 или VM = 0, CPL = 3, CR4.PVI = 1), то стойността, прочетена от стека за IF се записва във VIF;
- Ако TF ← 1, първият капан #DB се появява след следващата инструкция;
- VM и RF не се променят от тази инструкция.
|
| CPU |
| 8086 |
186 |
V20 |
286 |
386 |
486 |
P |
P-P |
P-II |
MMX |
SSE |
3D! |
E64 |
| • |
• |
• |
• |
• |
• |
• |
• |
• |
|
|
|
• |
|
| Изключения | ОБЩИ +
| Всички режими: |
#SS(0) |
ако eSP е извън стековия сегмент |
| #SS(0) |
при липса на място в стека |
| Режим V86: |
#GP(0) |
IOPL < 3 AND CR4.VME = 0 |
|