Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
LDS
Влияние команды на флаги и форматы команды:
|
|
|
|
|
|
|
|
|
C5 /r |
LDS r16,m16:16 |
Загрузить DS:r16 дальним указателем из памяти |
8086 |
lds ax,wordX |
C5 /r |
LDS r32,m16:32 |
Загрузить DS:r32 дальним указателем из памяти |
Intel386 |
lds eax,dwordZ |
0F B2 /r |
LSS r16,m16:16 |
Загрузить SS:r16 дальним указателем из памяти |
Intel386 |
lss di,vector |
0F B2 /r |
LSS r32,m16:32 |
Загрузить SS:r32 дальним указателем из памяти |
Intel386 |
lss esi,dwordBag |
C4 /r |
LES r16,m16:16 |
Загрузить ES:r16 дальним указателем из памяти |
8086 |
les ax,wordX |
C4 /r |
LES r32,m16:32 |
Загрузить ES:r32 дальним указателем из памяти |
Intel386 |
les eax,dwordZ |
0F B4 /r |
LFS r16,m16:16 |
Загрузить FS:r16 дальним указателем из памяти |
Intel386 |
lfs ax,wordX |
0F B4 /r |
LFS r32,m16:32 |
Загрузить FS:r32 дальним указателем из памяти |
Intel386 |
lfs eax,dwordZ |
0F B5 /r |
LGS r16,m16:16 |
Загрузить GS:r16 дальним указателем из памяти |
Intel386 |
lgs ax,wordX |
0F B5 /r |
LGS r32,m16:32 |
Загрузить GS:r32 дальним указателем из памяти |
Intel386 |
lgs eax,dwordZ |
Описание:
Команды LGS, LSS, LDS, LES и LFS считывают из памяти полный указатель, состоящий из селектора и смещения, и сохраняют его в выбранной паре сегментный регистр:регистр. Полный указатель содержит 16-битный селектор, который загружается в один из сегментных регистров SS, DS, ES, FS или GS, а также смещение, которое загружается в регистр, задаваемый первым операндом команды. Используется 32-битное смещение, если атрибут размера операнда равен 32 бита, или 16-битное смещение, если атрибут размера операнда равен 16 бит.
При загрузке селектора в сегментный регистр соответствующий дескриптор также загружается в скрытую часть этого сегментного регистра.
Нулевой селектор (значения 0000, … 0003) может быть загружен в DS, ES, FS или GS, не вызывая особой ситуации защиты. Любая последующая попытка обращения к памяти с использованием нулевого селектора вызывает исключение #GP(0). Никакого обращения в сегмент не происходит.
Операция:
IF Защищенный режим (* PE = 1, VM = 0 *)
THEN
IF Загружается SS
THEN
IF Загружаемый селектор нулевой THEN #GP(0); FI;
Проверка загружаемого селектора и соответствующего дескриптора в таблице GDT или LDT;
Индекс селектора должен попадать в пределы таблицы дескрипторов, иначе #GP(Селектор);
Поле RPL селектора должно быть равно CPL, иначе #GP(Селектор);
Поле DPL байта AR должно быть равно CPL, иначе #GP(Селектор);
Байт AR дескриптора должен задавать сегмент данных доступный для записи, иначе #GP(Селектор);
Сегмент должен быть помечен, как присутствующий, иначе #SS(Селектор);
SS = SegmentSelector(SRC);
SS = SegmentDescriptor([SRC]);
ELSE IF Загружается DS, ES, FS, or GS не нулевым селектором THEN
Проверка загружаемого селектора и соответствующего дескриптора в таблице GDT или LDT;
Индекс селектора должен попадать в пределы таблицы дескрипторов, иначе #GP(Селектор);
Байт AR дескриптора должен задавать сегмент данных или доступный для чтения кодовый сегмент, иначе #GP(Селектор);
Для дескриптора сегмента данных и несогласованного кодового сегмента RPL селектора и DPL дескриптора должны быть больше CPL, иначе #GP(Селектор);
Сегмент должен быть помечен, как присутствующий, иначе #NP(Селектор);
SegmentRegister = SegmentSelector(SRC) AND RPL;
SegmentRegister = SegmentDescriptor([SRC]);
ELSE IF Загружается DS, ES, FS, or GS нулевым селектором THEN
SegmentRegister = NullSelector;
SegmentRegister(DescriptorValidBit) = 0;
FI;
FI;
IF (Режим реальной адресации или режим V86)
THEN
SegmentRegister = SegmentSelector(SRC);
FI;
DEST = Offset(SRC);
Особые ситуации защищенного режима:
#GP(0), если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор, а также при попытке загрузки нулевого селектора в регистр SS.
#GP(Селектор), если индекс загруженного селектора не попадает в пределы таблицы дескрипторов, если при загрузке регистра SS запрашиваемый уровень привилегий селектора RPL или уровень привилегий соответствующего дескриптора сегмента DPL не равны текущему уровню привилегий CPL, если регистр SS загружается селектором, который указывает на сегмент запрещенный для записи, если регистр DS, ES, FS или GS загружается селектором сегмента, который не является доступным для чтения кодовым сегментом или сегментом данных, если регистр DS, ES, FS или GS загружается селектором сегмента, который является сегментом данных или несогласованным кодовым сегментом, и уровень привилегий дескриптора этого сегмента DPL меньше по значению запрашиваемого уровня привилегий селектора RPL и текущего уровня привилегий CPL.
#NP(Селектор), если регистр DS, ES, FS или GS загружен селектором сегмента, который помечен как неприсутствующий.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#SS(Селектор), если регистр SS загружен селектором сегмента, который помечен как неприсутствующий.
#UD, если второй операнд не является операндом в памяти.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
Особые ситуации режима реальной адресации:
#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.
#UD, если второй операнд не является операндом в памяти.
Особые ситуации режима V86:
Такие же, как и в режиме реальной адресации.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru