Андрей Газибаров


без тайни

Инструкциите On-line

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
 
Съдържание Пълен текст
 
  PDF, 3.6M Приложение, 18К