Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
VERW
Влияние команды на флаги и форматы команды:
|
|
|
|
|
* |
|
|
|
OF 00 /4 |
VERR r/m16 |
Установить ZF=1, если сегмент, заданный в r/m16 доступен для чтения |
Intel286 |
verr cx |
OF 00 /5 |
VERW r/m16 |
Установить ZF=1, если сегмент, заданный в r/m16 доступен для записи |
Intel286 |
verw dx |
Описание:
Команды VERR и VERW определяют доступен ли заданный операндом-источником сегмент на текущем уровне привилегий для чтения (VERR) или для записи (VERW). Операндом команд может быть 16-битный регистр общего назначения или операнд в памяти, который содержит значение селектора проверяемого сегмента. Если сегмент доступен, то устанавливается флаг ZF, если же сегмент не доступен, то флаг ZF сбрасывается.
Для установки флага ZF командами VERR, VERW необходимо выполнение следующих условий:
- индекс селектора должен попадать в пределы таблицы дескрипторов (GDT или LDT); селектор должен быть не нулевым;
- селектор должен указывать на дескриптор сегмента кода или данных, но не на дескриптор TSS, дескриптор LDT или дескриптор шлюза;
- для команды VERR сегмент должен быть доступен для чтения, а для команды VERW сегмент должен быть доступным для записи сегментом данных;
- если сегмент кода доступен для чтения и согласован, то уровень привилегий дескриптора (DPL) может быть любым для команды VERR, иначе DPL должен быть больше или равен (иметь меньше или столько же привилегий) CPL (текущий уровень привилегий) и RPL селектора.
Производимая проверка является такой же, как если бы сегмент был загружен в регистр DS, ES, FS или GS и был произведен указанный доступ (чтение или запись). Флаг ZF устанавливается по результату проверки. Никакие значение входного операнда-селектора не могут приводить к генерации особых ситуаций защиты, программное обеспечение с помощью команд VERR и VERW анализирует возможные проблемы доступа к сегментам в дальнейшем.
Операция:
IF SRC(Offset) > (GDTR(Limit) OR (LDTR(Limit))
THEN
ZF = 0;
ELSE
Загрузить информацию из дескриптора сегмента;
IF Descriptor.Type = 0 OR Descriptor.Type ≠ (Согласованный кодовый сегмент) AND ((CPL > DPL) OR (RPL > DPL)) (* Системный дескриптор или несогласованный кодовый сегмент с DPL меньшим CPL или RPL *)
THEN
ZF = 0;
ELSE
IF ((Instruction = VERR) AND (Сегмент доступен для чтения)) OR ((Instruction = VERW) AND (Сегмент доступен для записи))
THEN
ZF = 1;
FI;
FI;
FI;
Особые ситуации защищенного режима:
#GP(0), если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
Особые ситуации режима реальной адресации:
#UD при попытке исполнения команды.
Особые ситуации режима V86:
#UD при попытке исполнения команды.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru