-----------------------------------------------------------------|Код Команда Число Описание ||операции тактовых || циклов || ||8F /0 POP m16 6 Извлечение вершины стека и || помещение ее в слово памяти ||8F /0 POP m32 6 Извлечение вершины стека и || помещение ее в двойное слово || памяти ||58+ rw POP r16 4 Извлечение вершины стека и || помещение ее в слово - регистр ||58+ rd POP r32 4 Извлечение вершины стека и || помещение ее в двойное слово - || регистр ||1F POP DS 3 Извлечение вершины стека и || помещение ее в регистр DS ||07 POP ES 3 Извлечение вершины стека и || помещение ее в регистр ES ||17 POP SS 3 Извлечение вершины стека и || помещение ее в регистр SS ||0F A1 POP FS 3 Извлечение вершины стека и || помещение ее в регистр FS ||0F A9 POP GS 3 Извлечение вершины стека и || помещение ее в регистр GS |----------------------------------------------------------------- Работа команды IF StackAddrSize = 16THEN IF OperandSize = 16 THEN DEST <- (SS:SP); (* Копирование слова *) SP <- SP + 2; ELSE (* OperandSize = 32 *) DEST <- (SS:SP); (* Копирование двойного слова *) SP <- SP + 4; FI; ELSE (* StackAddrSize = 32 *) IF OperandSize = 16 THEN DEST <- (SS:ESP); (* Копирование слова *) ESP <- ESP + 2; ELSE (* OperandSize = 32 *) DEST <- (SS:ESP); (* Копирование двойного слова *) ESP <- ESP + 4; FI;FI; ОписаниеКоманда POP заменяет текущее содержимое операнда памяти, регистра илисегментного регистра словом, снятым с вершины стека i486, адресуемогоSS:SP (при атрибуте размера адреса 16 битов) или SS:ESP (при атрибутеразмера адреса 32 бита). Указатель стека SP получает приращение 2 приразмере операнда 16 битов или 4 при размере операнда 32 бита. После этогоуказатель устанавливается на новую вершину стека.Команда POP CS не является командой процессора i486. Извлечение из стека врегистр CS осуществляется командой RET.Если операнд назначения это сегментный регистр (DS, ES, FS или SS), тоизвлекаемое из стека значение должно являться селектором. В защищенномрежиме загрузка селектора инициирует автоматическую загрузку информациидескриптора, связанной с данным селектором, в скрытую часть сегментногорегистра: загрузка также инициирует контроль достоверности информацииселектора и дескриптора.Пустое значение (0000-0003) может быть извлечен в регистр DS, ES, FS илиGS, не вызывая исключения защиты. Попытка сослаться на сегмент, сегментныйрегистр которого был загружен пустым значением, вызовет исключение #GP(0).Ссылок к памяти не происходит. Сегмент при этом сохраняет пустое значение.Команда POP SS запрещает все прерывания, включая и немаскируемыепрерывания, до конца выполнения следующей команды. Это позволяетпоследовательное выполнение команд POP SS и POP eSP без опасности иметь вовремя прерывания неверное состояние стека. Однако, использование командыLSS для загрузки регистров SS и eSP предпочтительнее.Загрузка сегментного регистра в защищенном режиме сопровождaетсяспециальными проверками и действиями, как показано в следующем листинге: IF загружается SS: IF селектор пустой THEN #GP(0); Индекс селектора должен быть в границах его таблицы дескрипторов, ELSE #GP(селектор); RPL селектора должен быть равен CPL ELSE #GP(селектор); Байт AR должен задавать сегмент данных, доступный для записи, ELSE #GP(селектор); DPL в байте AR должен быть равен CPL ELSE #GP(селектор); Сегмент должен быть помечен как Присутствующий ELSE #NP(селектор); Загрузка регистра SS селектором; Загрузка регистра SS дескриптором; IF DS, ES, FS или GS загружается не-пустым селектором: Байт AR должен задавать сегмент данных или кодовый сегмент, доступный для записи чтения, ELSE #GP(селектор); IF сегмент данных или не-конформный сегмент кода THEN RPL и CPL должны быть меньше или равны DPL в байте AR; ELSE #GP(селектор); FI; Сегмент должен быть помечен как Присутствующий ELSE #NP(селектор); Загрузка сегментного регистра селектором; Загрузка сегментного регистра дескриптором; IF DS, ES, FS или GS загружается пустым селектором: Загрузка сегментного регистра селектором; Очистка бита Достоверности в невидимой части регистра Изменяемые флагиОтсутствуют Исключения защищенного режима#GP, #SS и #NP, если загружается сегментный регистр; #SS(0), если текущаявершина стека не находится в границах стекового сегмента; #GP(0), еслиназначением является сегмент, недоступный для записи; #GP(0) в случаенедопустимого исполнительного адреса операнда памяти в сегментах CS, DS,ES, FS или GS; #SS(0) в случае недопустимого адреса в сегменте SS; #PF(кодсбоя) в случае страничного сбоя; #AC для невыравненной ссылки к памяти притекущем уровне привилегированности, равном 3. Исключения режима реальных адресовПрерывание 13, если какая-либо часть операнда лежит вне пространстваисполнительных адресов от 0 до 0FFFFH. Исключения виртуального режима 8086Те же исключения, что и для режима реальных адресов: #PF (код сбоя) длястраничных сбоев. #AC для невыравненной ссылки к памяти при текущем уровнепривилегированности, равном 3. ПримечаниеРазрешены последовательности парных команд PUSH/POP, не требующиедополнительного тактового цикла между ними.