Assembler - язык неограниченных возможностей

         

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


  • Команда:
  • LGDT источник
  • Назначение:
  • Загрузить регистр GDTR
  • Процессор:
  • 80286

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

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

  • Команда:
  • SGDT приемник
  • Назначение:
  • Прочитать регистр GDTR
  • Процессор:
  • 80286

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

  • Команда:
  • LLDT источник
  • Назначение:
  • Загрузить регистр LDTR
  • Процессор:
  • 80286

    Загружает регистр LDTR, основываясь на селекторе, находящемся в источнике (16-битном регистре или переменной). Если источник — 0, все команды, кроме LAR, LSL, VERR и VERW, обращающиеся к дескрипторам из LDT, будут вызывать исключение #GP.

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

  • Команда:
  • SLDT приемник
  • Назначение:
  • Прочитать регистр LDTR
  • Процессор:
  • 80286

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

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

  • Команда:
  • LTR источник
  • Назначение:
  • Загрузить регистр TR
  • Процессор:
  • 80286

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


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

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

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

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

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

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

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

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



  • Команда:
  • LMSW источник
  • Назначение:
  • Загрузить слово состояния процессора
  • Процессор:
  • 80286
    Копирует младшие четыре бита источника (16-битный регистр или переменная) в регистр CR0, изменяя биты РЕ, МР, ЕМ и TS. Кроме того, если бит РЕ = 1, этой командой его нельзя обнулить, то есть нельзя выйти из защищенного режима. Команда LMSW существует только для совместимости с процессором 80286, и вместо нее всегда удобнее использовать mov cr0,еах.

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

  • Команда:
  • SMSW приемник
  • Назначение:
  • Прочитать слово состояния процессора
  • Процессор:
  • 80286
    Копирует младшие 16 бит регистра CR0 в приемник (16- или 32-битный регистр или 16-битная переменная). Если приемник 32-битный, значения его старших бит не определены. Команда SMSW существует только для совместимости с процессором 80286, и вместо нее удобнее использовать mov еах,cr0.

  • Команда:
  • CLTS
  • Назначение:
  • Сбросить флаг TS в CR0
  • Процессор:
  • 80286
    Команда сбрасывает в 0 бит TS регистра CR0, который устанавливается процессором в 1 после каждого переключения задач. CLTS предназначена для синхронизации сохранения/восстановления состояния FPU в многозадачных операционных системах: первая же команда FPU в новой задаче при TS = 1 вызовет исключение #NM, обработчик которого сохранит состояние FPU для старой задачи и восстановит сохраненное ранее для новой, после чего выполнит команду CLTS и вернет управление.

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

  • Команда:
  • ARPL приемник,источник
  • Назначение:
  • Коррекция поля RPL селектора
  • Процессор:
  • 80286
    Команда выполняет сравнение полей RPL двух сегментных селекторов. Приемник (16-битный регистр или переменная) содержит первый, а источник (16-битный регистр) содержит второй. Если RPL приемника меньше, чем RPL источника, устанавливается флаг ZF, и RPL приемника становится равным RPL источника. В противном случае ZF = 0 и никаких изменений не происходит. Обычно эта команда используется операционной системой, чтобы увеличить RPL селектора, переданного ей приложением, с целью удостовериться, что он соответствует уровню привилегий приложения (который система может взять из RPL сегмента кода приложения, находящегося в стеке).



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

  • Команда:
  • LAR приемник,источник
  • Назначение:
  • Прочитать права доступа сегмента
  • Процессор:
  • 80286
    Копирует байты, отвечающие за права доступа из дескриптора, описываемого селектором, находящимся в источнике (регистр или переменная), в источник (регистр) и устанавливает флаг ZF Если используются 16-битные операнды, копируется только байт 5 дескриптора в байт 1 (биты 8 – 15) приемника. Для 32-битных операндов дополнительно копируются старшие 4 бита (для сегментов кода и данных) или весь шестой байт дескриптора (для системных сегментов) в байт 2 приемника. Остальные биты приемника обнуляются. Если CPL > DPL или RPL > DPL — для неподчиненных сегментов кода, если селектор или дескриптор ошибочны или в других ситуациях, в которых программа не сможет пользоваться этим селектором, команда LAR возвращает ZF = 0.

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

  • Команда:
  • LSL приемник,источник
  • Назначение:
  • Прочитать лимит сегмента
  • Процессор:
  • 80286
    Копирует лимит сегмента (размер минус 1) из дескриптора, селектор для которого находится в источнике (регистр или переменная), в приемник (регистр) и устанавливает флаг ZF в 1. Если бит гранулярности в дескрипторе установлен и лимит хранится в единицах по 4096 байт, команда LSL переведет его значение в байты. Если используются 16-битные операнды и лимит не умещается в приемнике, его старшие биты теряются. Так же, как и в случае LAR, эта команда проверяет доступность сегмента из текущей программы, и, если сегмент недоступен, в приемник ничего не загружается и флаг ZF сбрасывается в 0.

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

  • Команда:
  • VERR источник
  • Назначение:
  • Проверить права на чтение
  • Команда:
  • VERW источник
  • Назначение:
  • Проверить права на запись
  • Процессор:
  • 80286
    Команды проверяют, доступен ли сегмент кода или данных, селектор которого находится в источнике (16-битный регистр или переменная) для чтения (VERR) или записи (VERW), с текущего уровня привилегий. Если сегмент доступен, эти команды возвращают ZF = 1, иначе — ZF = 0.



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

  • Команда:
  • INVD
  • Назначение:
  • Сбросить кэш-память
  • Команда:
  • WBINVD
  • Назначение:
  • Записать и сбросить кэш-память
  • Процессор:
  • 80486
    Эти команды объявляют все содержимое внутренней кэш-памяти процессора недействительным и подают сигнал для сброса внешнего кэша, так что после этого все обращения к памяти приводят к заполнению кэша заново. Команда WBINVD предварительно сохраняет содержимое кэша в память, команда INVD приводит к потере всей информации, которая попала в кэш, но еще не была перенесена в память.

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

  • Команда:
  • INVLPG источник
  • Назначение:
  • Аннулировать страницу
  • Процессор:
  • 80486
    Аннулирует (объявляет недействительным) элемент буфера TLB, описывающий страницу памяти, содержащую источник (адрес в памяти). Команда выполняется только в реальном режиме или с CPL = 0.

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

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

  • Команда:
  • RSM
  • Назначение:
  • Выйти из режима SMM
  • Процессор:
  • Р5
    Применяется для вывода процессора из режима SMM, использующегося для сохранения состояния системы в критических ситуациях (например, при выключении электроэнергии). При входе в SMM (исполняется при поступлении соответствующего сигнала на процессор от материнской платы) все регистры, включая системные, и другая информация сохраняются в специальном блоке памяти — SMRAM, а при выходе (который и осуществляется командой RSM) все восстанавливается.

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

  • Команда:
  • RDMSR
  • Назначение:
  • Чтение из MSR-регистра
  • Команда:
  • WRMSR
  • Назначение:
  • Запись в MSR-регистр
  • Процессор:
  • Р5
    <


    /p> Помещает содержимое машинно-специфичного регистра с номером, указанным в ЕСХ, в пару регистров EDX:EAX (старшие 32 бита в EDX и младшие в ЕАХ) (RDMSR) или содержимое регистров EDX:EAX — в машинно-специфичный регистр с номером в ЕСХ. Попытка чтения/записи зарезервированного или отсутствующего в данной модели MSR приводит к исключению #GP(0).

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

  • Команда:
  • RDTSC
  • Назначение:
  • Чтение из счетчика тактов процессора
  • Процессор:
  • Р5
    Помещает в регистровую пару EDX:EAX текущее значение счетчика тактов — 64-битного машинно-специфичного регистра TSC, значение которого увеличивается на 1 каждый такт процессора с момента его последней перезагрузки. Этот машинно-специфичный регистр доступен для чтения и записи при помощи команд RDMSR/WRMSR как регистр номер 10h, причем на Pentium Pro при записи в него старшие 32 бита всегда обнуляются. Так как машинно-специфичные регистры могут отсутствовать на отдельных моделях процессоров, их наличие всегда следует определять при помощи команды CPUID (бит 4 в EDX — наличие TSC).

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

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

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



  • Команда:
  • SYSENTER
  • Назначение:
  • Быстрый системный вызов
  • Команда:
  • SYSEXIT
  • Назначение:
  • Быстрый возврат из системного вызова
  • Процессор:
  • РII
    Команда SYSENTER загружает в регистр CS число из регистра MSR #174h, в регистр EIP — число из регистра MSR #176h, в регистр SS — число, равное CS + 8 (селектор на следующий дескриптор), и в регистр ESP — число из MSR #175h. Эта команда предназначена для передачи управления операционной системе — ее можно вызывать с любым CPL, а вызываемый код должен находиться в бессегментной памяти с CPL = 0. На самом деле SYSENTER модифицирует дескрипторы используемых сегментов — сегмент кода будет иметь DPL = 0, базу 0, лимит 4 Гб, станет доступным для чтения и 32-битным, а сегмент стека также получит базу 0, лимит 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 Гб, доступ для чтения/записи и 32-битную разрядность. Поля RPL в CS и SS устанавливаются в 3.

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

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


    Содержание раздела