-----------------------------------------------------------------|Код Команда Число Описание ||операции тактовых || циклов || ||C3 RET 5 Возврат (ближний) в || вызывающую процедуру ||CB RET 13,pm=18 Возврат (дальний) в || вызывающую процедуру, || та же привилегированность ||CB RET 13,pm=33 Возврат (дальний) || меньшая привилегированность, || стеки переключения задач ||C2 iw RET imm16 5 Возврат (дальний), || извлечение из стека imm16 || байтов параметров ||CA iw RET imm16 14,pm=17 Возврат (дальний), || та же привилегированность, || извлечение из стека imm16 || байтов ||CA iw RET imm16 14,pm=33 Возврат (дальний), || меньшая привилегированность, || извлечение из стека imm16 || байтов |----------------------------------------------------------------- Работа команды IF команда = ближний RETTHEN IF OperandSize = 16 THEN IP <- Pop(); EIP <- EIP AND 0000FFFFH; ELSE (* OperandSize = 32 *) EIP <- Pop(); FI; IF в команде задан непосредственный операнд THEN eSP <- eSP + imm16; FI;FI; IF (PE = 0 OR (PE = 1 AND VM = 1)) (* режим реальных адресов или виртуальный режим 8086 *) AND команда = дальний RET THEN IF OperandSize = 16 THEN IP <- Pop(); EIP <- EIP AND 0000FFFFH; CS <- Pop(); (* Извлечение из стека 16 битов *) ELSE (* OperandSize = 32 *) EIP <- Pop(); CS <- Pop(); (* извлечение из стека 32 битов, 16 битов теряются *) FI; IF в команде задан непосредственный операнд THEN eSP <- eSP + imm16; FI;FI; IF (PE = 1 AND VM = 0) (* Защищенный режим, не виртуальный режим 8086 *) AND команда = дальний RET THEN IF OperandSize = 16 THEN третье слово в стеке должно находиться в границах стека иначе #SS(0); ELSE второе слово в стеке должно находиться в границах стека иначе #SS(0); FI; RPL селектора возврата должен быть >= CPL ELSE #GP(селектор возврата); IF RPL селектора возврата = CPL THEN GOTO ТОТ-ЖЕ-УРОВЕНЬ; ELSE GOTO ВНЕШНИЙ-УРОВЕНЬ-ПРИВИЛЕГИРОВАННОСТИ; FI;FI; ТОТ-ЖЕ-УРОВЕНЬ: Селектор возврата должен быть не-пустым ELSE #GP(0) Индекс селектора должен быть в границах его таблицы дескрипторов, ELSE #GP(селектор); Байт AR дескриптора должен задавать кодовый сегмент, ELSE #GP(селектор); IF не-конформный THEN DPL кодового сегмента должен быть равен CPL; ELSE #GP(селектор); FI; IF конформный THEN DPL кодового сегмента должен быть <= CPL; ELSE #GP(селектор); FI; Кодовый сегмент должен Присутствовать ELSE #NP(селектор); Верхнее слово в стеке должно быть в границах стека ELSE #SS(0); IP должен быть в границах кодового сегмента ELSE #GP(0); IF OperandSize = 32 THEN Загрузка CS:EIP из стека Загрузка регистра CS дескриптором Инкремент eSP на 4 плюс непосредственное значение смещения, если оно существует FI; ВНЕШНИЙ-УРОВЕНЬ-ПРИВИЛЕГИРОВАННОСТИ: IF OperandSize = 32 THEN Верхние (16+непосредственное значение) байтов в стеке должны быть в пределах границ стека, иначе #SS(0); ELSE Верхние (8+непосредственное значение) байтов в стеке должны быть в пределах границ стека, иначе #SS(0); FI; Рассмотрим селектор CS возврата и связанный с ним дескриптор: Селектор должен быть не-пустым, иначе #GP(0); Индекс селектора должен быть в границах его таблицы дескрипторов, ELSE #GP(селектор); Байт AR дескриптора должен задавать кодовый сегмент, ELSE #GP(селектор); IF не-конформный THEN DPL кодового сегмента должен быть = RPL селектора возврата; ELSE #GP(селектор); FI; IF конформный THEN DPL кодового сегмента должен быть <= RPL селектора возврата, ELSE #GP(селектор); FI; Сегмент должен присутствовать, иначе #NP(селектор); Рассмотрим селектор SS возврата и связанный с ним дескриптор: Селектор должен быть не-пустым, иначе #GP(0); Индекс селектора должен быть в границах его таблицы дескрипторов, ELSE #GP(селектор); RPL селектора должен быть равен RPL селектора CS возврата ELSE #GP(селектор); Байт AR дескриптора должен задавать сегмент данных, доступный для записи, ELSE #GP(селектор); DPL дескриптора должен быть = RPL селектора CS возврата; ELSE #GP(селектор); Сегмент должен присутствовать, иначе #NP(селектор); Указатель команд должен быть в пределах границ кодового сегмента, ELSE #GP(0); Установка CPL равным RPL селектора CS возврата; IF OperandMode = 32 THEN Загрузка CS:EIP из стека; Установка RPL CS равным CPL; Инкремент eSP на 8 плюс непосредственное значение смещения, если оно существует; Загрузка SS:eSP из стека; ELSE (* OperandMode *) Загрузка CS:IP из стека; Установка RPL CS равным CPL; Инкремент eSP на 4 плюс непосредственное значение смещения, если оно существует; Загрузка SS:eSP из стека; FI; Загрузка регистра CS дескриптором CS возврата; Загрузка регистра SS дескриптором SS возврата; FOR каждого из ES, FS, GS и DS DO; IF текущее значение регистра недостоверно для внешнего уровня, регистр устанавливается пустым (селектор <- AR <- 0); Чтобы быть достоверным, установка регистра должна удовлетворять следующим свойствам: Индекс селектора должен быть в границах его таблицы дескрипторов; Байт AR дескриптора должен задавать сегмент данных или кодовый сегмент, доступный для чтения; IF это сегмент данных или не-конформный кодовый сегмент, THEN DPL должен быть >= CPL, или DPL должен быть >= RPL; FI; OD; ОписаниеКоманда RET передает управление на адрес возврата, находящийся в стеке.Адрес обычно помещается в стек командой CALL, а возврат выполняется ккоманде, расположенной после команды CALL.Необязательный числовой параметр команды RET определяет число байтов(operandMode = 16) или слов (OperandMode = 32), которые должны бытьосвобождены после извлечения из стека адреса возврата. Эти элементы обычноиспользуются как входные параметры вызываемой процедуры).Для внутрисегментного (ближнего) возврата адрес в стеке это смещениесегмента, извлекаемое из стека и помещаемое в указатель команд. Регистр CSне изменяется. Для межсегментного (дальнего) возврата адрес в стеке этодлинный указатель. Сначала из стека извлекается смещение, а за нимселектор.В реальном режиме регистры CS и IP загружаются прямо. В защищенном режимемежсегментный возврат заставляет процессор проверить дескриптор,адресуемый селектором возврата. Байт AR дескриптора должен обозначатькодовый сегмент, равный или менее привилегированный (с большим или равнымчисловым номером уровня привилегированности), нежели текущий уровеньпривилегированности. Возврат на меньший уровень привилегированностивызывает перезагрузку стека из значения, записанного после блокапараметров.Во время меж-уровневой передачи управления команда RET может очиститьрегистры DS, ES, FS и GS. Если эти регистры относятся к сегментам, которыене могут быть использованы на новом уровне привилегированности, ониочищаются, чтобы предупредить неразрешенный доступ с нового уровняпривилегированности. Изменяемые флагиОтсутствуют Исключения защищенного режима#GP, #NP или #SS, как указано выше в разделе "Работа команды"; # PF(кодсбоя) в случае страничного сбоя; Исключения режима реальных адресовПрерывание 13, если какая-либо часть извлекаемого из стека операнда лежитза адресом 0FFFFH. Исключения виртуального режима 8086Те же исключения, что и для режима реальных адресов: #PF (код сбоя) длястраничных сбоев.