Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
LIDT
Влияние команды на флаги и форматы команды:
|
|
|
|
|
|
|
|
|
0F 01 /2 |
LGDT m16&32 |
Загрузить операнд из памяти в регистр GDTR |
Intel286 |
lgdt globalT |
0F 01 /3 |
LIDT m16&32 |
Загрузить операнд из памяти в регистр LDTR |
Intel286 |
lidt [ebx] |
Описание:
Команды LGDT и LIDT загружают линейный базовый адрес и значение предела из шестибайтного операнда в памяти в регистр GDTR или IDTR соответственно.
Если с командами LGDT и LIDT используется 16-битный атрибут размера операнда, то регистр загружается 16-битным пределом и 24-битной базой, а старшие 8 бит шестибайтного операнда не используются. Если используется 32-битный атрибут размера операнда, то загружаются 16-битный предел и 32-битная база, а старшие 8 бит шестибайтного операнда используются как старшие биты базового адреса таблицы дескрипторов.
Команды SGDT и SIDT являются обратными по отношению к LGDT и LIDT, они сохраняют в памяти все 48 бит из регистров GDTR и IDTR.
В 16-битных процессорах (8086, 80186, Intel286) старшие 8 бит сохраненного значения после выполнения команд SGDT или SIDT не определены.
Для 32-битных процессоров в старшие 8 бит записываются старшие 8 бит базового адреса таблицы дескрипторов для размеров операндов и 16, и 32 бита. Если команда LGDT или LIDT используется с 16-битным операндом для загрузки регистра, сохраненного командой SGDT или SIDT, то старшие 8 бит базового адреса таблицы дескрипторов загружаются как нули.
Команды LGDT и LIDT используются в системном программном обеспечении, они не используются в прикладных программах. В защищенном режиме только эти команды используют в качестве операнда непосредственный линейный адрес (т.е. не смещение в сегменте).
Эти команды допустимы в реальном режиме, для обеспечения начальной загрузки при инициализации защищенного режима.
Операция:
IF (Команда типа LIDT)
THEN
IF OperandSize = 16
THEN
IDTR.Limit = SRC[0:15];
IDTR.Base = SRC[16:47] AND 00FFFFFFH;
ELSE
IDTR(Limit) = SRC[0:15];
IDTR(Base) = SRC[16:47];
FI;
ELSE (* Команда типа LGDT *)
IF OperandSize = 16
THEN
GDTR.Limit = SRC[0:15];
GDTR.Base = SRC[16:47] AND 00FFFFFFH;
ELSE
GDTR(Limit) = SRC[0:15];
GDTR(Base) = SRC[16:47];
FI;
FI;
Особые ситуации защищенного режима:
#UD, если операнд-источник не является операндом в памяти.
#GP(0), если текущий уровень привилегий не равен 0, также если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
Особые ситуации режима реальной адресации:
#UD, если операнд-источник не является операндом в памяти.
#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.
Особые ситуации режима V86:
#GP(0), если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru