10.2. Системные и привилегированные команды

Команда

Назначение

Процессор

LGOT источник

,               Загрузить регистр GDTR

80286

Команда загружает значение источника (6-байтная переменная в памяти) в ре­гистр ОБТЯ. Если текущая разрядность операндов 32 бита, в качестве размера таблицы глобальных дескрипторов используются младшие два байта а в качестве ее линейного — следующие четыре. Если текущая разрядность

операндов. - 16 бит, для линейного адреса используются только байты 3, 4, 5 из операнда, а ъ самый старший байт адреса записываются нули.

Команда выполняется исключительно в реальном режиме или при СРЕ = 0.

Команда       . Назначение Процессор

SGDT приемник Прочитать регистр сЬтИ ' 80286

Помещает содержимое регистра ОБТЯ в приемник (6-байтная переменная в па­мяти). Если текущая разрядность операндов - 16 бит, самый старший байт этой

переменной заполняется нулями (начиная с 80386, а 286 заполнял его единицами).

Команда Назначение Процессор

И-РТ источник Загрузить регистр' ЮТИ 802В6

Загружает регистр ЕБТЯ, основываясь на селекторе, находящемся в источни­ке (16-битном регистре или переменной). Если источник - 0, все команды, кроме ЕАЯ, Е8Е, УЕЯЯ и УЕЯ\У, обращающиеся к дескрипторам из ЕБТ, будут вызы­вать исключение #0Р.

Команда выполняется только в защищенном режиме с СРЕ = 0.

Команда

Назначение

Процессор

SLDT приемник

Прочитать регистр LDTR

80286

Помещает селектор, находящийся в регистре LDTR, в приемник     или 32-

битный регистр или переменная). Этот селектор указывает на дескриптор в GDT текущей LDT. Если приемник 32-битный, старшие 1б бит обнуляются на Pentium Pro и не определены на предыдущих процессорах.

Команда выполняется в защищенном режиме.

Команда

Назначение

Процессор

LTR источник

Загрузить регистр TR

80286

Загружает регистр задачи ТЯ, основываясь на селекторе, находящемся в ис­точнике (16-битном регистре или переменной), который указывает на сегмент со­стояния задачи (ТББ). Эта команда обычно используется для загрузки первой задачи при инициализации многозадачной системы.

Команда выполняется только в защищенном режиме с       = 0.

С и стем ные КСШиНДЫ

Команда

Назначение

Процессор

STR приемник

Прочитать регистр TR

80286

Помещает селектор, находящийся в регистре TR, в приемник (1б- или 32-бит­ный регистр или переменная). Этот селектор указывает на дескриптор в GDT, описывающий TSS текущей задачи. Если приемник 32-битный, старшие 16 бит обнуляются на Pentium Pro и не определены на предыдущих процессорах.

Команда выполняется только в защищенном режиме.

Команда

Назначение

Процессор

LIDT источник

Загрузить регистр IDTR

80286

Загружает значение источника (6-байтная переменная в памяти) в регистр IDTR. Если текущая разрядность операндов - 32 бита, в качестве размера табли­цы глобальных дескрипторов используются младшие два байта операнда, а в ка­честве ее линейного адреса - следующие четыре. Если текущая разрядность опе­рандов - 16 бит, для линейного адреса используются только байты 3, 4, 5 из операнда, а самый старший байт адреса устанавливается нулевым.

Команда выполняется исключительно в реальном режиме или при CPL = 0.

Команда Назначение Процессор

SIDT приемник Прочитать регистр IDTR 80286

Помещает содержимое регистра GDTR в приемник (6-байтная переменная в па­мяти). Если текущая разрядность операндов - 16 бит, самый старший байт этой пе­ременной заполняется нулями (начиная с 80386, а 286 заполнял его единицами).

Команда Назначение Процессор

MOV приемник.источник Пересылка данных в/из управляющие/их 80386

Приемником или источником команды MOV могут быть регистры CRO - CR4 и DRO - DR7. В этом случае другой операнд команды обязательно должен быть 32-битным регистром общего назначения. При записи в регистр CR3 сбрасыва­ются все записи в TLB, кроме глобальных страниц в Pentium Pro. Во время моди­фикации бит РЕ или PG в CRO и PGE, PSE или РАЕ в CR4 сбрасываются все записи в TLB без исключения.

Команды выполняются только в реальном режиме или с CPL = 0.

Команда

Назначение

Процессор

LMSW источник

Загрузить слово состояния процессора

80286

Копирует младшие четыре бита источника (16-битный регистр или перемен­ная) в регистр СЯО, изменяя биты РЕ, МР, ЕМ и Т8. Кроме того, если бит РЕ - 1. этой командой его нельзя обнулить, то есть нельзя выйти из защищенного режима.

Команда ЕМ8\¥ существует только для совместимости с процессором 80286, и вместо нее всегда удобнее использовать шоу сгО.еах

Команда выполняется только в реальном режиме или с СРЕ = 0.

Команда

Назначение

Процессор

приемник

Прочитать слово состояния процессора

80286

Копирует младшие 1 ббит регистра СБЮ в приемник (16-или 32-битный регистр ил» 16-битная переменная). Если приемник 32-битный, значения его старших би­тов не определены. Команда нужна для совместимости в процессором 80286, и вместо нее удобнее использовать шоу еах,сгО.

Команда

Назначение

Процессор

CLTS

Сбросить флаг TS в CRO

80286

Команда сбрасывает в 0 бит TS регистра CRO, который устанавливается про­цессором в 1 после каждого переключения задач. CLTS предназначена для син­хронизации сохранения/восстановления состояния FPU в многозадачных опера­ционных системах: первая же команда FPU в новой задаче при TS = 1 вызовет исключение #NM, обработчик которого сохранит состояние FPU для старой за­дачи и восстановит сохраненное ранее для новой, после чего выполнит команду CLTS и вернет управление.

Команда выполняется только в реальном режиме или с CPL = 0.

Команда

Назначение

Процессор

ARPL приемник.источник

Коррекция поля RPL селектора

80286

Команда сравнивает поля ЯРЕ двух сегментных селекторов. Приемник (16-бит­ный регистр или переменная) содержит первый, а источник (16-битный регистр) -второй. Если ЯРЕ приемника меньше, чем ЯРЕ источника, устанавливается флаг 7Е, и ЯРЕ приемника становится равным ЯРЕ источника. В противном случае ZF = 0 и никаких изменений не происходит. Обычно эта команда используется

операционной системой, чтобы увеличить ЯРЕ селектора, переданного ей прило­жением, с целью удостовериться, что он соответствует уровню привилегий при­ложения (который система может взять из ЯРЬсегмента кода приложения, нахо­дящегося в стеке).

Команда выполняется только в защищенном режиме (с любым СРЕ).

Команда .

Назначение

Процессор

LAR лриемник,источник

Прочитать права доступа сегмента

80286:

Копирует байты, отвечающие за права доступа из дескриптора, описываемого селектором, который находится в источнике (регистр или переменная), в источник (регистр) иустанавливаетфлаггЕ Если используются 16-битные операнды, копи­руется только байт 5 дескриптора в байт 1 (биты 8-15) приемника. Для 32-битных операндов дополнительно копируются старшие четыре бита (для сегментов кода и данных) или весь шестой байт дескриптора (для системных сегментов) в байт 2 приемника. Остальные биты приемника обнуляются. Если СРЕ > БРЕили ЯРЕ > БРЬ - для неподчиненных сегментов кода, если селектор или дескриптор оши­бочны или в других ситуациях, когда программа не сможет пользоваться этим се­лектором, команда ЬАІІ возвращает 7Е = 0.

Команда выполняется только в защищенном режиме. . '

Команда

Назначение

Процессор

(.81. приемник.источник

.       Прочитать лимит сегмента

80286

Копирует лимит сегмента (размер минус 1) из дескриптора, селектор для ко­торого находится в источнике (регистр или переменная), в приемник (регистр) и устанавливает флаг ZF в 1. Если бит гранулярности в дескрипторе установлен и лимит хранится в единицах по 4096 байт, команда Ь8Ь переведет его значение в байты. Если используются 16-битные операнды и лимит не умещается в при­емнике, его старшие биты теряются. Как и в случае с ЕДЯ, эта команда проверя­ет доступность сегмента из текущей программы: если сегмент недоступен, в при­емник ничего не загружается и флаг ZF сбрасывается в 0.

Команда выполняется только в защищенном режиме.

Команда

Назначение

Процессор

VERR источник

Проверить права на чтение

80286

УЁН\№ источник

Проверить права на запись

80286

Команды проверяют, доступен ли сегмент кода или данных, селектор которого находится в источнике (16-битный регистр или переменная), для чтения (УЕЯЯ) или записи (УЕЯ\У) с текущего уровня привилегий. Если сегмент доступен, то команды возвращают ZF = 1, иначе - ZF = 0.

Команды выполняются только в защищенном режиме.

Команда

Назначение

Процессор

INVD

Сбросить кэш-память

80486

\WBINVD

Записать и сбросить кэш-память

80486

Эти команды объявляют все содержимое внутренней кэш-памяти процессора недействительным и подают сигнал для сброса внешнего кэша, так что после этого все обращения к памяти приводят к заполнению кэша заново. Команда \¥БП\ГУЕ) предварительно сохраняет содержимое в память, команда приводит к потере всей информации, которая попала в кэш, но еще не была перенесена в память.

Команды выполняются только в реальном режиме или с       = 0.

Команда

Назначение

Процессор

МУЬРй источник

Аннулировать страницу

80486

Аннулирует (объявляет недействительным) элемент буфера ТЬВ, описываю­щий страницу памяти, которая содержит источник (адрес в памяти). Команда выполняется только в реальном режиме или с СР1. = 0.

Команда

Назначение

Процессор

HLT

Остановить процессор

8086

Переводит процессор в состояние останова, из которого его может вывести только аппаратное прерывание или перезагрузка. Если причиной было прерыва­ние, то адрес возврата, помещаемый в стек для обработчика прерывания, указы­вает на следующую после HLT команду.

Команда выполняется только в реальном режиме или с CPL = 0.

Команда

Назначение

Процессор

RSM

Выйти из режима SMM

P5

Применяется для вывода процессора из режима использующегося для

сохранения состояния системы в критических ситуациях (например, при выклю­чении электроэнергии). При входе в SMM (происходит во время поступления со­ответствующего сигнала на процессор от материнской платы) все регистры, вклю­чая системные, и другая информация сохраняются в специальном блоке памяти -SMRAM, а при выходе (который и осуществляется командой все восста-

навливается.

Команда выполняется только в режиме

Команда

Назначение

Процессор

ROMSR

Чтение из MSR-регистра

Р5 ;

WRMSR

Запись в MSR-регистр

р5

Помещает содержимое машинно-специфичного регистра с номером, указанным в ЕСХ, в пару регистров ЕБХ:ЕАХ (старшие 32 бита в ЕБХ и младшие в ЕАХ) (КЕ^Я) или содержимое регистров EDX:EAX - в машинно-специфичный ре­гистр с номером в ЕСХ. Попытка чтения/записи зарезервированного или отсут­ствующего в данной модели М8Я приводит к исключению #ОР(0).

Команда выполняется только в реальном режиме или с CPL = 0.

Команда

Назначение

Процессор

RDTSC

Чтение из счетчика тактов процессора

Р5

Помещает в регистровую пару EDX:EAX текущее значение счетчика тактов -64-битного машинно-специфичного регистра TSC, значение которого увеличива­ется на 1 каждый такт процессора с момента его последней перезагрузки. Этот машинно-специфичный регистр доступен для чтения и записи с помощью команд RDMSR/WRMSRKaKperacTp номер 1 Oh, причем на Pentium Pro при записи в него старшие 32 бита всегда обнуляются. Так как машинно-специфичные регистры могут отсутствовать на отдельных моделях процессоров, их наличие всегда сле­дует определять посредством СРИГО (бит 4 в ЕЕХ - наличие Т8С).

Команда выполняется на любом уровне привилегий, если бит TSD в регистре СКО равен нулю, и только в реальном режиме или с CPL = 0, если бит Т8Е = 1.

Команда

Назначение

Процессор

RDPMC

Чтение из счетчика событий

Р6

Помещает значение одного из двух программируемых счетчиков событий (40-битные машинно-специфичные регистры Clh и C2h для Pentium Pro и Pentium II) в регистровую пару EDX:EAX. Выбор читаемого регистра определяется числом О или 1 в ЕСХ. Аналогичные регистры есть и на Pentium (и Cyrix 6х86МХ), но они имеют номера 1 lh и 12h, и к ним можно обращаться только при помощи команд RDMSR/WRMSR.

Способ выбора типа подсчитываемых событий тоже различается в Pentium и Pentium Pro - для Pentium надо выполнить запись в 64-битный регистр MSR О llh, разные двойные слова которого управляют выбором режима каждого из счетчиков и типа событий, а для Pentium Pro/Pentium II надо выполнить запись в регистр 187пдля счетчика 0 и 188Ьдля счетчика 1. Соответственно и наборы со­бытий между этими процессорами сильно различаются: 38 событий на Pentium, 83 - на Pentium Pro и 96 - на Pentium II.

Команда

Назначение

Процессор

SYSENTER

Быстрый системный вызов

РИ

SYSEXIT

Быстрый возврат из системного вызова

РИ

Команда SYSENTER загружает в регистр CS число из регистра MSR #174h, в регистр EIP - число из регистра MSR #176h, в регистр SS - число, равное CS + 8 (селектор на следующий дескриптор), и в регистр ESP - число из MSR #175h. Эта команда предназначена для передачи управления операционной системе - ее можно вызывать с любым CPL, а вызываемый код должен находиться в бессег­ментной памяти с CPL = 0. На самом деле SYSENTER модифицирует дескрипторы используемых сегментов - сегмент кода будет иметь DPL = 0, базу 0, лимит 4 Гб, станет доступным для чтения и 32-битным, а сегмент стека также получит базу О, лимит 4 Гб, DPL = 0, 32-битный режим, доступ для чтения/записи и установлен­ный бит доступа. Кроме того, селекторы CS и SS получают RPL = 0.

Команда SYSEXIT загружает в регистр CS число, равное содержимому регист­ра MSR #174h плюс 16, в EIP - число из EDX, в SS - число, равное содержимому регистра MSR #174h плюс 24, и в ESP - число из ЕСХ. Эта команда предназначеш! для передачи управления в бессегментную модель памяти с CPL = 3 и тоже фицирует дескрипторы. Сегмент кода получает DPL = 3, базу 0, лимит 4 Гб, доступ для чтения, перестает быть подчиненным и становится 32-битным. Сегмент стека также получает базу 0, лимит 4 Гб, доступ для чтения/записи и разряд­ность. Поля RPL в CS и SS устанавливаются в 3.

Поддержку команд SYSENTER/SYSEXIT всегда следует проверять при помо­щи команды CPUID (бит 11). Кроме того, надо убедиться, что номер модели про­цессора не меньше трех, так как Pentium Pro (тип процессора 6, модель 1) не име­ет команд SYSENTER/SYSEXIT, но бит в CPUID возвращается равным 1.

SYSENTER выполняется лишь в защищенном режиме, a SYSEXIT - только с CPL = 0.