Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
LSL
Влияние команды на флаги и форматы команды:
|
|
|
|
|
* |
|
|
|
0F 03 /r |
LSL r16,r/m16 |
r16 = G(L)DT(r/m16).LIMIT |
Intel286 |
lsl ax,bx |
0F 03 /r |
LSL r32,r/m32 |
r32 = G(L)DT(r/m32).LIMIT |
Intel386 |
lsl eax,ebx |
Описание:
Команда LSL сохраняет в операнде-назначении преобразованное значение предела сегмента из дескриптора, который задается селектором в операнде-источнике команды, если этот дескриптор видим при текущем уровне привилегий (измененном при помощи RPL селектора) и имеет допустимый тип (смотрите таблицу ниже). Иначе, флаг ZF очищается, а регистр-назначение остается неизменным.
Если дескриптор имеет предел, выраженный в байтах, то его значение напрямую загружается в регистр-назначение, если же предел выражен в страницах, то команда LSL переводит его к байтовому выражению перед загрузкой в регистр-назначение (производится сдвиг двадцатиразрядного предела из дескриптора влево на 12 бит, затем OR 00000FFFh).
32-битные формы команды LSL сохраняют 32-битный предел в 32-битном регистре-назначении. При размере операнда 16 бит предел вычисляется в 32-битной форме, но при записи в регистр-назначение старшие 16 бит отбрасываются.
Если задаваемый селектором из операнда-источника дескриптор не видим при текущем уровне привилегий или имеет недопустимый для данной команды тип, то флаг ZF сбрасывается. Все дескрипторы сегментов кода и данных допустимы для команды LSL. Для этой команды таже допустимы и некоторые специальные дескрипторы (см. таблицу 6.74.).
Таблица 6.74. Допустимость специальных дескрипторов для команды LSL
Тип (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-битный шлюз ловушки |
недопустим |
Команда LSL может исполняться только в защищенном режиме, попытка ее использования в режиме реальной адресации или режиме V86 приводит к генерации особой ситуации #UD.
Операция:
IF SRC(Offset) > Предел таблицы дескрипторов THEN ZF = 0; FI;
Загрузить дескриптор сегмента;
IF (Загруженный дескриптор не определяет согласованный кодовый сегмент) AND ((CPL > DPL) OR (RPL > DPL)) OR (Загруженный дескриптор не является корректным для данной команды)
THEN
ZF = 0;
ELSE
ZF = 1;
temp = SegmentLimit([SRC]);
IF (G = 1)
THEN
temp = ShiftLeft(12, temp) OR 00000FFFH;
FI;
IF OperandSize = 32
THEN
DEST = temp;
ELSE (*OperandSize = 16*)
DEST = temp AND FFFFH;
FI;
FI;
Особые ситуации защищенного режима:
#GP(0), если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
Особые ситуации режима реальной адресации:
#UD при попытке использовать команду.
Особые ситуации режима V86:
#UD при попытке использовать команду.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru