-----------------------------------------------------------------|Код Команда Число Описание ||операции тактовых || циклов ||EB cb JMP rel8 3 Переход короткий ||E9 cw JMP rel16 3 Переход ближний, смещение || относительно следующей команды||FF /4 JMP r/m16 5/5 Переход ближний косвенный ||EA cd JMP ptr16:16 17,pm=19 Переход межсегментный, 4-бай- || товый непосредственный адрес ||EA cd JMP ptr16:16 32 Переход к шлюзу вызова, та же || привилегированность ||EA cd JMP ptr16:16 42+TS Переход через сегмент состоя- || ния задачи ||EA cd JMP ptr16:16 42+TS Переход через шлюз задачи ||FF/5d JMP m16:16 13,pm=18 Переход r/m16:16 косвенный и || межсегментный ||FF /5 JMP m16:16 3 Переход к шлюзу вызова, та же || привилегированность ||FF /5 JMP m16:16 41+TS Переход через сегмент состоя- || ния задачи ||FF /5 JMP m16:16 42+TS Переход через шлюз задачи ||E9 cd JMP rel32 3 Переход ближний, смещение || относительно следующей команды||FF /4 JMP r/m32 5/5 Переход ближний косвенный ||EA cp JMP ptr16:32 13,pm=18 Переход межсегментный, 6-бай- || товый непосредственный адрес ||EA cp JMP ptr16:32 31 Переход к шлюзу вызова, та же || привилегированность ||EA cp JMP ptr16:32 42+TS Переход через сегмент состоя- || ния задачи ||EA cp JMP ptr16:32 43+TS Переход через шлюз задачи ||FF /5 JMP m16:32 13,pm=18 Переход межсегментный, адрес || в двойном слове r/m ||FF /5 JMP m16:32 31 Переход к шлюзу вызова, та же || привилегированность ||FF /5 JMP m16:32 41+TS Переход через сегмент состоя- || ния задачи ||FF /5 JMP m16:32 42+TS Переход через шлюз задачи |----------------------------------------------------------------- Примечание: значения ts задаются следующей таблицей: ----------------------------------------------------------------- | Новая задача Старая задача |------------------------------------------- | к TSS i486 | к TSS 80286 | к TSS VM----------------------------------------------------------------- VM/i486/TSS 80286 | 199 | 180 | 177----------------------------------------------------------------- Работа команды IF команда = относительный переход JMP (* т.е. операнд это rel8, rel16 или rel32 *)THEN EIP <- EUP + rel8/16/32; IF OperandSize = 16 THEN EIP <- EIP AND 0000FFFFH; FI;FI; IF команда = ближний косвенный переход JMP (* т.е. операнд это r/m16 или r/m32 *)THEN IF OperandSize = 16 THEN EIP <- [r/m16 AND 0000FFFFH; ELSE (* OperandSize = 32 *) EIP <- [r/m32; FI;FI; IF (PE = 0 OR (PE = 1 AND VM = 1))(* режим реальных адресов или виртуальный режим 8086 *) AND команда = дальний JMP (* т.е. тип операнда равен m16:16, m16:32, ptr16:16, ptr16:32 *)THEN GOTO РЕЖИМ-РЕАЛЬНЫХ-АДРЕСОВ-ИЛИ-V86 IF тип операнда = m16:16 или m16:32 THEN (* косвенный *) IF OperandSize = 16 THEN CS:IP <- [m16:16; EIP <- EIP AND 0000FFFFH: (* очистка старших 16 битов *) ELSE (* OperanfSize = 32 *) CS:EIP <- [m16:32; FI; FI; IF тип операнда = ptr16:16 или ptr16:32 THEN IF OperandSize = 16 THEN CS:IP <- ptr16:16; EIP <- EIP AND 0000FFFFH: (* очистка старших 16 битов *) ELSE (* OperanfSize = 32 *) CS:EIP <- ptrm16:32; FI; FI;FI; IF (PE = 1 AND VM = 0) (* Защищенный режим, но не режим V86 *) AND команда = дальний JMPTHEN IF тип операнда = m16 или m16:32 THEN (* Косвенный *) Проверить доступ к двойному слову EA; #GP(0) или #SS(0) IF нарушение границы; FI; Селектор назначения не должен быть пустым, ELSE #GP(0); Индекс селектора назначения должен быть в пределах границ дескрипторной таблицы; ELSE #GP(селектор) В зависимости от байта AR дескриптора назначения: GOTO КОНФОРМНЫЙ-КОДОВЫЙ-СЕГМЕНТ; GOTO НЕКОНФОРМНЫЙ-КОДОВЫЙ-СЕГМЕНТ; GOTO ШЛЮЗ-ВЫЗОВА; GOTO ШЛЮЗ-ЗАДАЧИ; GOTO СЕГМЕНТ-СОСТОЯНИЯ-ЗАДАЧИ; ELSE #GP(селектор); (* Недопустимый байт AR в дескрипторе *)FI; КОНФОРМНЫЙ-КОДОВЫЙ-СЕГМЕНТ: DPL дескриптора должен быть <= CPL ELSE #GP(селектор); Сегмент должен присутствовать ELSE #NP (селектор); Указатель команд должен быть в границах кодового сегмента ELSE #GP(0); IF OperandSize = 16 THEN Загрузить CS:EIP из указателя назначения; ELSE Загрузить CS:IP из указателя назначения; FI; Загрузить регистр CS новым дескриптором сегмента; НЕКОНФОРМНЫЙ-КОДОВЫЙ-СЕГМЕНТ: RPL селектора назначения должен быть <= CPL ELSE #GP(селектор); DPL дескриптора должен быть = CPL ELSE #GP(селектор); Сегмент должен присутствовать ELSE #NP (селектор); Указатель команд должен быть в границах кодового сегмента ELSE #GP(0); IF OperandSize = 32 THEN Загрузить CS:EIP из указателя назначения; ELSE Загрузить CS:IP из указателя назначения; FI; Загрузить регистр CS новым дескриптором сегмента; Установить поле RPL для CS равным CPL; ШЛЮЗ-ВЫЗОВА: DPL дескриптора должен быть >= CPL ELSE #GP(селектор шлюза); DPL дескриптора должен быть >= RPL селектора шлюза ELSE #GP(селектор шлюза); Шлюз должен присутствовать ELSE #NP(селектор шлюза); Рассмотрим селектор кодового сегмента в дескрипторе шлюза вызова: Селектор не должен быть пустым ELSE #GP(0) Селектор должен быть в пределах границ его дескрипторной таблицы ELSE #GP(селектор CS) Байт AR выбранного дескриптора должен обозначать кодовый сегмент ELSE #GP (селектор CS) IF не-конформный THEN DPL дескриптора кодового сегмента должен быть = CPL ELSE #GP(селектор CS); FI; IF конформный THEN DPL дескриптора кодового сегмента должен быть <= CPL; ELSE #GP(селектор CS); Кодовый сегмент должен присутствовать ELSE #NP(селектор CS); Указатель команд должен быть в границах кодового сегмента ELSE #GP(0); IF OperandSize = 32 THEN Загрузить CS:EIP из шлюза вызова; ELSE Загрузить CS:IP из шлюза вызова; FI; Загрузить регистр CS новым дескриптором кодового сегмента; Установить поле RPL для CS равным CPL; ШЛЮЗ-ЗАДАЧИ: DPL дескриптора шлюза должен быть >= CPL ELSE #TS(селектор шлюза) DPL дескриптора шлюза должен быть >= RPL селектора шлюза ELSE #GP(селектор шлюза) Шлюз задачи должен присутствовать ELSE #NP(селектор шлюза) Исследовать селектор TSS, заданный в дескрипторе шлюза задачи: Он должен задавать бит Глобальный/Локальный как Глобальный ELSE #GP(селектор TSS) Индекс должен находиться в пределах границы GDT ELSE #GP(селектор TSS) Байт AR дескриптора TSS должен задавать доступный TSS (младшие биты 00001); ELSE #GP(селектор TSS) Сегмент состояния задачи (TSS) должен присутствовать ELSE #NP(селектор TSS) ПЕРЕКЛЮЧЕНИЕ-ЗАДАЧ (без вложенности) на TSS Указатель команд должен находиться в границе кодового сегмента ELSE #GP(0) СЕГМЕНТ-СОСТОЯНИЯ-ЗАДАЧИ: DPL для TSS должен быть >= CPL ELSE #GP(селектор TSS) DPL для TSS должен быть >= RPL селектора TSS ELSE #GP(селектор TSS) Байт AR дескриптора должен задавать доступный TSS (младшие биты 00001) ELSE #GP(селектор TSS) Сегмент состояния задачи (TSS) должен присутствовать ELSE #NP(селектор TSS) ПЕРЕКЛЮЧЕНИЕ-ЗАДАЧ (без вложенности) на TSS Указатель команд должен находиться в границе кодового сегмента ELSE #GP(0); ОписаниеКоманда JMP передает управление в другую точку потока команд, не записываяинформации для выполнения возврата. Ниже описано действие для различных форм команды.Команды перехода с типом назначения r/m16m, r/m32 и r/m32 выполняютближний переход и не влекут изменения значения сегментного регистра. Формы команды перехода JMP rel16 и JMP rel32 складывают смещение с адресомкоманды, следующей за JMP, чтобы определить назначение команды. Форма сrel16 используется, когда атрибут размера операнда команды равен 16 битам(только атрибут размера сегмента 16); форма с rel32 используется, когдаатрибут размера операнда команды равен 32 битам (только атрибут размерасегмента 32). Результат сохраняется в 32-разрядном регистре EIP. В случаеrel16 старшие 16 битов регистра EIP очищаются, и таким образом, получаетсясмещение, размер которого не превышает 16 битов. Формы JMP r/m16 и JMP r/m32 задают регистр или адрес памяти, из котороговыбирается абсолютное смещение в процедуре. Выбранное из r/m смещениеравно 32 битам для атрибута размера операнда, равного 32 битам (r/m32),или 16 битам для атрибута размера операнда, равного 16 битам (r/m16). Формы команды JMP ptr16:16 и ptr16:32 используют четырехили шести-байтовыеоперанды в качестве длинных указателей на назначение. Формы JMP m16:16 иm16:32 выбирают дальний указатель из заданного адреса памяти (косвенноеобращение). В режиме реальных адресов или виртуальном режиме 8086 длинныйуказатель обеспечивает 16 битов для регистра CS и 16 или 32 бита длярегистра EIP (в зависимости от атрибута размера операнда). В защищенномрежиме обе формы с длинными указателями проверяют байт прав доступа (AR) вдескрипторе, индексируемом селекторной частью длинного указателя. Взависимости от значения байта AR переход будет осуществлять один изследующих типов передачи управления:- Переход к кодовому сегменту на том же уровне привилегированности.- Переключение задачи. Более подробная информация о передаче управления в защищенном режименаходится в главах 6 и 7. Изменяемые флагиПри переключении задачи изменяются все флаги; если же переключение задачине происходит, то флаги не изменяются. Исключения защищенного режимаДля дальних переходов: #GP, #NP, #SS и #TS, как указано выше.Для ближних прямых переходов: #GP(0), если процедура находится запределами границы кодового сегмента; #AC для невыравненной ссылки к памятипри текущем уровне привилегированности, равном 3. Для ближних косвенных переходов: #GP(0) в случае недопустимогоисполнительного адреса операнда памяти в сегментах CS, DS, ES, FS или GS;#SS(0) в случае недопустимого адреса в сегменте SS; # GP, если полученноекосвенное смещение лежит за границами кодового сегмента; #PF(код сбоя) вслучае страничного сбоя; #AC для невыравненной ссылки к памяти при текущемуровне привилегированности, равном 3. Исключения режима реальных адресовПрерывание 13, если какая-либо часть операнда лежит вне пространстваисполнительных адресов от 0 до 0FFFFH. Исключения виртуального режима 8086Те же исключения, что и для режима реальных адресов: #PF (код сбоя) длястраничных сбоев; #AC для невыравненной ссылки к памяти при текущем уровнепривилегированности, равном 3. ПримечанияВсе команды ветвления преобразуются для выборки в 16-байтовые коды,независимо от адреса перехода или возможности кеширования.