Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
LAR
Влияние команды на флаги и форматы команды:
|
|
|
|
|
* |
|
|
|
0F 02 /r |
LAR r16,r/m16 |
r16 = G(L)DT(r/m16).AR AND FF00h |
Intel286 |
lar ax,dx |
0F 02 /r |
LAR r32,r/m32 |
r32 = G(L)DT(r/m32).AR AND 00FxFF00h |
Intel386 |
lar eax,edx |
Описание:
Команда LAR сохраняет в операнде-назначении частично замаскированную форму второго двойного слова дескриптора, который задается селектором в операнде-источнике команды, если дескриптор видим при текущем уровне привилегий (измененном при помощи поля RPL селектора), и если дескриптор имеет допустимый тип.
При 32-битном размере операнда 32-битный регистр-назначение загружается старшим двойным словом дескриптора, маскированным 00FxFF00h и устанавливается флаг ZF (x обозначает, что четыре бита, соответствующие четырем старшим битам предела, не определены в значении, загружаемом командой LAR).
При 16-битном размере операнда 16-битный регистр-назначение загружается младшими 16 битами старшего двойного слова дескриптора, маскированными FF00h и устанавливается флаг ZF.
Если задаваемый селектором из операнда-источника дескриптор невидим при текущем уровне привилегий или имеет недопустимый для данной команды тип, то флаг ZF сбрасывается. Все дескрипторы сегментов кода и данных допустимы для команды LAR. Для этой команды таже допустимы и некоторые специальные дескрипторы (см. таблицу 6.62.).
Команда LAR может исполняться только в защищенном режиме, попытка ее использования в режиме реальной адресации или режиме V86 приводит к генерации особой ситуации #UD.
Таблица 6.62. Допустимость специальных дескрипторов для команды LAR
Тип (Type) |
Имя |
Допустим/ недопустим |
0000 |
Зарезервировано |
недопустим |
0001 |
Свободный 16-битный TSS |
допустим |
0010 |
Локальная таблица дескрипторов (LDT) |
допустим |
0011 |
Занятый 16-битный TSS |
допустим |
0100 |
16-битный шлюз вызова |
допустим |
0101 |
Шлюз задачи |
допустим |
0110 |
16-битный шлюз прерывания |
недопустим |
0111 |
16-битный шлюз ловушки |
недопустим |
1000 |
Зарезервировано |
недопустим |
1001 |
Свободный 32-битный TSS |
допустим |
1010 |
Зарезервировано |
недопустим |
1011 |
Занятый 32-битный TSS |
допустим |
1100 |
32-битный шлюз вызова |
допустим |
1101 |
Зарезервировано |
недопустим |
1110 |
32-битный шлюз прерывания |
недопустим |
1111 |
32-битный шлюз ловушки |
недопустим |
Операция:
IF SRC(Offset) > Предел таблицы дескрипторов THEN ZF = 0; FI;
Загрузить дескриптор сегмента;
IF (Загруженный дескриптор не определяет согласованный кодовый сегмент) AND ((CPL > DPL) OR (RPL > DPL)) OR (Загруженный дескриптор не является корректным для данной команды)
THEN
ZF = 0
ELSE
ZF = 1;
IF OperandSize = 32
THEN
DEST = [SRC] AND 00FxFF00H;
ELSE (*OperandSize = 16*)
DEST = [SRC] AND FF00H;
FI;
FI;
Особые ситуации защищенного режима:
#GP(0), если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
Особые ситуации режима реальной адресации:
#UD при попытке использовать команду.
Особые ситуации режима V86:
#UD при попытке использовать команду.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru