ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 35

LEA  - Загрузка исполнительного адреса
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|8D /r     LEA r16,m        1      Записать исполнительный адрес|
|                                  для m в регистр r16          |
|8D /r     LEA r32,m        1      Записать исполнительный адрес|
|                                  для m в регистр r32          |
|8D /r     LEA r16,m        1      Записать исполнительный адрес|
|                                  для m в регистр r16          |
|8D /r     LEA r32,m        1      Записать исполнительный адрес|
|                                  для m в регистр r32          |
-----------------------------------------------------------------
Работа команды
--------------
IF OperandSize = 16 AND AddressSize = 16
THEN r16 <- Addr(m);
ELSE
  IF OperandSize = 16 AND AddressSize = 32
  THEN
    r16 <- Усечение_до_16_битов(Addr(m)); (* 32-разрядный адрес *
  ELSE
    IF OperandSize = 32 AND AddressSize = 16
    THEN
      r32 <- Усечение_до_16_битов(Addr(m));
    ELSE
      IF OperandSize = 32 AND AddressSize = 32
      THEN  r32 <- Addr(m);
      FI:
    FI;
  FI;
FI;
Описание
--------
Команда LEA вычисляет исполнительный адрес (часть его,
определяющую смещение) и записывает его в заданный регистр.
Атрибут размера операнда команды (представленный в описании
работы команды выше именем OperandSize) определяется выбранным
регистром. Атрибут размера адреса (представленный именем
AddressSize) определяется атрибутом USE сегмента, содержащего
второй операнд. Атрибутиы размера адреса и размера операнда
влияют на действие, выполняемые командой LEA, следующим образом:
-----------------------------------------------------------------
Размер операнда  Размер адреса    Выполняемое действие
-----------------------------------------------------------------
   16               16         Вычисляется 16-разрядный исполните
ль-
                               ный адрес и записывается в запроше
                               нный 16-разрядный регистр назначен
ия.
   16               32         Вычисляется 32-разрядный исполните
ль-
                               ный адрес. Младшие 16 битов адреса
                               записываются в запрошенный 16-раз-
                               рядный регистр назначения.
   32               16         Вычисляется 16-разрядный исполните
ль-
                               ный адрес. 16-разрядный адрес расш
и-
                               ряется нулем и записывается в зап-
                               рошенный 32-разрядный регистр назн
а-
                               чения.
   32               32         Вычисляется 32-разрядный исполните
ль-
                               ный адрес и записывается в запроше
                               нный 32-разрядный регистр назначен
ия.
-----------------------------------------------------------------
Изменяемые флаги
----------------
Отсутствуют
Исключения защищенного режима
----------------------------------
#UD, если второй операнд является регистром.
Исключения режима реальных адресов
---------------------------------------
Прерывание 6, если второй операнд является регистром.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и в режиме реальных адресов.
-----------------------------------------------------------------
LEAVE - Выход из процедуры высокого уровня
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|C9        LEAVE            5      Установить SP в BP и затем   |
|                                  извлечь BP из стека          |
|C9        LEAVE            5      Установить ESP в EBP и затем |
|                                  извлечь EBP из стека         |
-----------------------------------------------------------------
Работа команды
--------------
IF StackAddrSize = 16
THEN
  SP <- BP;
ELSE  (* StackAddrSize = 32 *)
  ESP <- EBP;
FI;
IF OperandSize = 16
THEN
  BP <- Pop();
ELSE (* OperandSize = 32 *)
  EBP <- Pop();
FI;
Описание
--------
Команда LEAVE имеет действие, противоположное команде ENTER.
Копируя указатель кадра в указатель стека, команда LEAVE
освобождает область стека, используемую процедурой для своих
локальных переменных. Старый указатель кадра извлекается из
стека в регистр BP или EBP, восстанавливая кадр стека вызывающей
процедуры. Последующая команда RET nn удаляет любые аргументы,
помещенные в стек при входе в процедуру.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#SS(0), если регистр BP не указывает на адрес памяти в границах
текущего сегмента стека.
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть извлекаемого из стека
операнда лежит за адресом 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и в режиме реальных адресов.
-----------------------------------------------------------------
LGDT/LIDT - Загрузка регистра таблицы дескрипторов
            глобальной/прерываний
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|0F 01 /2  LGDT m16&32     11      Загрузка m в GDTR            |
|0F 01 /3  LIDT m16&32     11      Загрузка m в IDTR            |
-----------------------------------------------------------------
Работа команды
--------------
IF команда = LIDT
THEN
  If OperandSize = 16
  THEN IDTR.граница:база <- m16:24 (* Загружается 24 бита базы *)
  ELSE IDTR.граница:базв <- m16:32
  FI;
ELSE (* Команда = LGDT *)
  If OperandSize = 16
  THEN GDTR.граница:база <- m16:24 (* Загружается 24 бита базы *)
  ELSE GDTR.граница:базв <- m16:32
  FI;
FI;
Описание
--------
Команды LGDT и LIDT загружают значения линейного базового адреса
и границы из шести-байтового операнда данных в памяти в регистры
GDTR и IDTR, соответственно. Если с командой LGDT или LIDT
используется 16-разрядный операнд, то регистр загружается
16-разрядной границей и 24-разрядной базой, а старшие восемь
битов шести-байтового операнда данных не используются. Если
используется 32-разрядный операнд, то загружаются 16-разрядная
граница и 32-разрядная база; старшие восемь битов
шести-байтового операнда используются как старшие адресные биты
базы.
Команды SGDT и SIDT всегда выполеняют запись во все 48 битов
шести-байтного операнда данных. В случае процессора 80286
после выполнения команд SGDT и SIDT старшие восемь битов
неопределены. В случае процессоров 386 DX или i486 старшие
восемь битов помещаются в восьми старших адресных битах, как для
16-разрядных, так и для 32-разрядных операндов. Если команда
LGDT или LIDT используется с 16-разрядным операндом для загрузки
регистра, записанного командами SGDT или SIDT, то старшие восемь
битов хранятся в виде нулей.
Команды LGDT и LIDT используются в системном программном
обеспечении; прикладным программам они не нужны. Это
единственные команды, напрямую загружающие линейный адрес (а не
адрес относительно сегмента) в защищенном режиме.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0), если текущий уровень привилегированности не равен 0;
#UD, если исходный операнд является регистром; #GP(0) в случае
недопустимого исполнительного адреса операнда памяти в сегментах
CS, DS, ES, FS или GS; #SS(0) в случае недопустимого адреса в
сегменте SS; #PF(код сбоя) в случае страничного сбоя;
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH. Прерывание
6, если исходный операнд является регистром;
Примечание: Эти команды допустимы в режиме реальных адресов,
чтобы позволить инициализацию при включении питания для
защищенного режима.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев.
-----------------------------------------------------------------
LGS/LSS/LDS/LES/LFS - Загрузка полного указателя
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|C5 /r    LDS r16,m16:16   6/12    Загрузка в DS:r16 указателя  |
|                                  памяти                       |
|C5 /r    LDS r32,m16:32   6/12    Загрузка в DS:r32 указателя  |
|                                  памяти                       |
|0F B2 /r LSS r16,m16:16   6/12    Загрузка в SS:r16 указателя  |
|                                  памяти                       |
|0F B2 /r LSS r32,m16:32   6/12    Загрузка в SS:r32 указателя  |
|                                  памяти                       |
|C4 /r    LES r16,m16:16   6/12    Загрузка в ES:r16 указателя  |
|                                  памяти                       |
|C4 /r    LES r32,m16:32   6/12    Загрузка в ES:r32 указателя  |
|                                  памяти                       |
|0F B4 /r LFS r16,m16:16   6/12    Загрузка в FS:r16 указателя  |
|                                  памяти                       |
|0F B4 /r LFS r32,m16:32   6/12    Загрузка в FS:r32 указателя  |
|                                  памяти                       |
|0F B5 /r LGS r16,m16:16   6/12    Загрузка в GS:r16 указателя  |
|                                  памяти                       |
|0F B5 /r LGS r32,m16:32   6/12    Загрузка в GS:r32 указателя  |
|                                  памяти                       |
-----------------------------------------------------------------
Работа команды
--------------
CASE команда OF
  LSS: Sreg это SS;  (* Загрузить регистр SS *)
  LDS: Sreg это DS;  (* Загрузить регистр SD *)
  LES: Sreg это ES;  (* Загрузить регистр ES *)
  LFS: Sreg это FS;  (* Загрузить регистр FS *)
  LGS: Sreg это GS;  (* Загрузить регистр GS *)
ESAC;
IF (OperandSize = 16)
THEN
  r16 <- [Исполнительный адрес]; (* 16-разрядная пересылка *)
  Sreg <- [Исполнительный адрес + 2]; (* 16-разрядная пересыдка *
  (* В защищенном режиме это загрузка  дескриптора  в  сегментный
     регистр *)
ELSE (* OperandSize = 32 *)
  r32 <- [Исполнительный адрес]; (* 32-разрядная пересылка *)
  Sreg <- [Исполнительный адрес + 4]; (* 16-разрядная пересыдка *
  (* В защищенном режиме это загрузка  дескриптора  в  сегментный
     регистр *)
FI;
Описание
--------
Команды LGS, LSS, LDS, LES и LFS читают из памяти полный
указатель и записывают его в выбранную пару сегментный
регистр:регистр. Полный указатель загружает 16 битов в
сегментный регистр SS, DS, ES, FS или GS. Другой регистр
загружает 32 бита, если атрибут размера операнда равен 32 бита,
или 16 битов, если этот атрибут равен 16. Этот загружаемый 16-
или 32-разрядный регистр определяется заданным операндом r16 или
r32.
Когда одному из сегментных регистров сделано назначение, в
сегментный регистр также загружается дескриптор. Данные для
этого регистра берутся из элемента дескрипторной таблицы,
соответствующего выбранному селектору.
В регистры DS, ES, FS или GS может быть загружен пустой селектор
(значения 0000 - 0003), не вызывая исключения защиты.
(Любые последующие ссылки на сегмент, соответствующий сегментный
регистр которого загружен пустым селектором, для адресации
памяти вызовут особую ситуацию #GP(0). Ссылка к памяти для
такого сегмента фактически не происходит).
Ниже приводится листинг проверок и действий в защищенном режиме,
выполняемых при загрузке сегментного регистра:
IF загружается SS:
  IF селектор пустой THEN #GP(0); FI;
  Индекс селектора  должен  быть  в  границах  его  дескрипторной
    таблицы  ELSE #GP(селектор);
  RPL селектора должен быть равен CPL ELSE #GP(селектор);
  Байт AR должен обозначать сегмент данных, доступный для записи
     ELSE #GP(селектор);
  DPL в байте AR должен быть равен CPL ELSE #GP(селектор);
  Сегмент должен   быть   помечен   как    Присутствующий    ELSE
      #SS(селектор);
  Загрузка SS селектором;
  Загрузка SS дескриптором;
IF DS, ES, FS или GS загружен не-пустым селектором:
  Индекс селектора  должен  быть  в  границах  его  дескрипторной
    таблицы  ELSE #GP(селектор);
  Байт AR должен обозначать сегмент данных  или  кода,  доступный
    для чтения ELSE #GP(селектор);
  IF сегмент данных или не-конформный кодовый сегмент
  THEN и RPL, и CPL должны быть меньше или равны DPL байта AR;
  ELSE #GP(селектор);
  Сегмент должен   быть   помечен   как    Присутствующий    ELSE
      #NP(селектор);
  Загрузка сегментного регистра селектором и битами RPL;
  Загрузка сегментного регистра дескриптором;
IF DS, ES, FS или GS загружен пустым селектором:
  Загрузка сегментного регистра селектором;
  Очистка бита Достоверности в дескрипторе;
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0) в случае недопустимого исполнительного адреса операнда
памяти в сегментах CS, DS, ES, FS или GS; #SS(0) в случае
недопустимого адреса в сегменте SS; второй операнд должен быть
операндом памяти, а не регистром; #GP(0) при загрузке в SS
пустого селектора; #PF(код сбоя) в случае страничного сбоя; #AC
для невыравненной ссылки к памяти при текущем уровне
привилегированности, равном 3.
Исключения режима реальных адресов
---------------------------------------
Второй операнд должен быть операндом памяти, а не регистром;
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Примечание: Эти команды допустимы в режиме реальных адресов,
чтобы позволить инициализацию при включении питания для
защищенного режима.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев; #AC для невыравненной ссылки к
памяти при текущем уровне привилегированности, равном 3.
-----------------------------------------------------------------
LLDT - Загрузка локальной таблицы дескрипторов
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|0F 00 /2  LLDT r/m16      11/11   Загрузка селектора r/m16     |
|                                  в LDTR                       |
-----------------------------------------------------------------
Работа команды
--------------
LDTR <- SRC;
Описание
--------
Команда LLDT загружает регистр локальной дескрипторной таблицы
(LDTR). Операнд-слово (операнд памяти или регистр) команды LLDT
должен содержать селектор в глобальной дескрипторной таблице
(GDT). Элемент GDT должен представлять собой локальную
дескрипторную таблицу. В этом случае LDTR загружается этим
элементом. На регистры DS, ES, SS, FS, GS и CS команда не
влияет. Поле LDT в сегменте состояния задачи не изменяется.
Операнд-селектор может быть равен 0; в этом случае LDTR
помечается как неДостоверный. Все ссылки к дескриптору (за
исключением выполняемых командами LAR, VERR, VERW или LSL)
вызывают особую ситуацию #GP.
Команда LLDT используется программным обеспечением операционной
системы; прикладные программы ее не используют.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0), если текущий уровень привилегированности не равен 0; #GP
(селектор), если операнд-селектор не указывает на глобальную
дескрипторную таблицу, или если указанный элемент в GDT не
является локальной дескрипторной таблицей (LDT); #NP(селектор),
если дескриптор LDT не Присутствует; #GP(0) в случае
недопустимого исполнительного адреса операнда памяти в сегментах
CS, DS, ES, FS или GS; #SS(0) в случае недопустимого адреса в
сегменте SS; #PF(код сбоя) в случае страничного сбоя;
Исключения режима реальных адресов
---------------------------------------
Прерывание 6; команда LLDT в режиме реальных адресов не
распознается.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов (поскольку
команда не распознается, она не выполняется и не ведет к ссылке
к памяти).
Примечание
----------
Атрибут размера операнда на эту команду не влияет.
-----------------------------------------------------------------
LMSW - Загрузка слова состояния машины
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|0F 01 /6  LMSW r/m16      13/13   Загрузка r/m16 в слово       |
|                                  состояния машины             |
-----------------------------------------------------------------
Работа команды
--------------
MSW (слово состояния машины) <- r/m16 (* в слово состояния машины
                                         записывается 16 битов *)
Описание
--------
Команда LMSW загружает слово состояния машины (часть регистра
CR0) из исходного операнда. Эта команда может использоваться для
переключения к защищенному режиму: в этом случае за ним должен
следовать внутрисегментный переход, очищающий очередь команд.
Команда LMSW не выполняет обратное переключение к режиму
реальных адресов.
Команда LMSW используется только в системном программном
обеспечении. В прикладных программах она не используется.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0), если текущий уровень привилегированности не равен 0; #GP
(0) в случае недопустимого исполнительного адреса операнда
памяти в сегментах CS, DS, ES, FS или GS; #SS(0) в случае
недопустимого адреса в сегменте SS; #PF(код сбоя) в случае
страничного сбоя;
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев.
Примечание
----------
Атрибут размера операнда на эту команду не влияет. Данная
команда обеспечивает совместимость с процессором 80286;
программы для процессора i486 должны вместо нее использовать
команду MOV CR0, ... . Команда LMSW не влияет на биты PG или ET,
и она не может служить для очистки бита PE.
-----------------------------------------------------------------
LOCK - Префикс возбуждения сигнала LOCK#
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|F0        LOCK               1    Возбуждение сигнала LOCK#    |
|                                  для следующей команды        |
-----------------------------------------------------------------
Описание
--------
Префикс LOCK вызывает возбуждение сигнала LOCK# процессора i486
на время выполнения следующей за ним команды. В случае
многопроцессорной среды данный сигнал может обеспечивать
исключительное использование процессором i486 любой разделяемой
области памяти, пока сигнал LOCK# возбужден. Последовательность
чтения-модификации-записи, обычно используемая для реализации
операций тестирования-и-установки процессора i486, включает
команду BTS.
Префикс LOCK работает только в сочетании со следующими
командами:
     BTS, BTR, BTC                       mem, reg/imm
     XCHG                                reg, mem
     XCHG                                mem, reg
     ADD, OR, ADC, SBB, AND, SUB, XOR    mem, reg/imm
     NOT, NEG, INC, DEC                  mem
При использовании префикса LOCK с командами, не входящими в
приведенный выше перечень, генерируется ловушка неопределенного
кода операции.
Команда LOCK всегда возбуждает сигнал LOCK#, независимо от
присутствия или отсутствия префикса LOCK.
Выравнивание поля памяти не влияет на целостность префикса LOCK.
Захват памяти происходит и для произвольных, невыравненных полей
памяти.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#UD, если префикс LOCK используется с командами, не
перечисленными выше в разделе "Описание"; прочие исключения
могут генерироваться последующими (монопольными, или с захватом)
командами.
Исключения режима реальных адресов
---------------------------------------
Прерывание 6, если префикс LOCK используется с командами, не
перечисленными выше в разделе "Описание"; прочие исключения
могут генерироваться последующими (монопольными, или с захватом)
командами.
Исключения виртуального режима 8086
----------------------------------------
#UD, если префикс LOCK используется с командами, не
перечисленными выше в разделе "Описание"; прочие исключения
могут генерироваться последующими (монопольными, или с захватом)
командами.
-----------------------------------------------------------------
LODS/LODSB/LODSW/LODSD - Загрузка строкового операнда
-----------------------------------------------------------------
|Код       Команда     Число      Описание                      |
|операции              тактовых                                 |
|                      циклов                                   |
|                                                               |
|AC        LODS m8       5        Загрузка байта                |
|                                 [(E)SI] в AL                  |
-----------------------------------------------------------------
Работа команды
--------------
IF
AddrSize = 16
THEN использовать SI для индекса-источника
ELSE (* AddressSize = 32 *)
  использовать ESI для индекса-источника;
FI;
IF команда байтового типа
THEN
  AL <- [индекс-источника]; (* Загрузка байта *)
  IF DF = 0 THEN IncDec <- 1 ELSE IncDec <- -1; FI;
ELSE
  IF OperandSize = 16
  THEN
    AX <- [индекс-источника]; (* Загрузка слова *)
    IF DF = 0 THEN IncDec <- 2 ELSE IncDec <- -2; FI;
  ELSE (* OperandSize = 32 *)
    EAX <- [индекс-источника]; (* Загрузка двойного слова *)
    IF DF = 0 THEN IncDec <- 4 ELSE IncDec <- -4; FI;
  FI;
FI;
индекс-источника <- индекс-источника + IncDec
Описание
--------
Команда LODS загружает регистр AL, AX или EAX байтом, словом или
двойным словом памяти из адреса, на который указываеи регистр
индекса-источника. После выполнения пересылки регистр
индекса-источника автоматически продвигается. Если флаг DF равен
0 (была выполнена команда CLD), происходит инкремент индекса
источника; Если флаг DF равен 1 (была выполнена команда STD),
происходит декремент индекса источника. Инкремент или декремент
выполняется на 1 при загрузке байта, 2 при загрузке слова и 4
при загрузке двойного слова.
Если атрибут размера адреса команды равен 16 битам, то в
качестве индекса-источника используется регистр SI; в противном
случае атрибут размера адреса равен 32 битам, и используется
регистр ESI. Адрес исходных данных определяется исключительно
содержимым регистра SI или ESI. Перед выполнением команды LODS в
регистр SI должно быть загружено верное значение индекса.
Команды LODSB, LODSW и LODSD являются синонимами команды LODS
для работы с байтом, словом и двойным словом, соответственно.
Команде LODS может предшествовать префикс REP; однако, команда
LODS чаще используется в конструкции цикла LOOP, поскольку далее
должна обычно следовать обработка данных, пересланных в регистры
EAX, AX или AL.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0) в случае недопустимого исполнительного адреса операнда
памяти в сегментах CS, DS, ES, FS или GS; #SS(0) в случае
недопустимого адреса в сегменте SS; #PF(код сбоя) в случае
страничного сбоя; #AC для невыравненной ссылки к памяти при
текущем уровне привилегированности, равном 3.
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев; #AC для невыравненной ссылки к
памяти при текущем уровне привилегированности, равном 3.
-----------------------------------------------------------------
LOOP/LOOPусловие - Управление циклом при помощи счетчика CX
-----------------------------------------------------------------
|Код       Команда     Число      Описание                      |
|операции              тактовых                                 |
|                      циклов                                   |
|                                                               |
|E2 cb     LOOP rel8    2,6       DEC счетчика, короткий переход|
|                                 если счетчик <> 0             |
|E1 cb    LOOPE rel8    9,6       DEC счетчика, короткий переход|
|                                 если счетчик <> 0 и ZF = 1    |
|E1 cb    LOOPZ rel8    9,6       DEC счетчика, короткий переход|
|                                 если счетчик <> 0 и ZF = 1    |
|E0 cb    LOOPNE rel8   9,6       DEC счетчика, короткий переход|
|                                 если счетчик <> 0 и ZF = 0    |
|E0 cb    LOOPNZ rel8   9,6       DEC счетчика, короткий переход|
|                                 если счетчик <> 0 и ZF = 0    |
-----------------------------------------------------------------
Работа команды
--------------
IF AddrSize = 16 THEN CountReg это CX ELSE CountReg это ECX; FI;
CountReg <- CountReg - 1;
IF команда <> LOOP
THEN
  IF (команда = LOOPE) OR (команда = LOOPZ)
  THEN BranchCond <- (ZF = 1) AND (CountReg <> 0);
  FI;
  IF (команда = LOOPNE) OR (команда = LOOPNZ)
  THEN BranchCond <- (ZF = 0) AND (CountReg <> 0);
  FI;
FI;
IF BranchCond         (* Условие перехода *)
THEN
  IF OperandSize = 16
  THEN
    IP <- IP + SignExtend(rel8);
  ELSE (* OperandSize = 32 *)
    EIP <- EIP + SignExtend(rel8);
  FI;
FI;
Описание
--------
Команда LOOP декрементирует счетный регистр без изменения любого
из флагов. Затем для используемой формы команды LOOP проверяются
условия. Если условия удовлетворяются, то выполняется короткий
переход к метке, заданной как операнд команды LOOP. Если атрибут
размера адреса равен 16 битам, то в качестве регистра-счетчика
используется регистр CX; в противном случае используется регистр
ECX. Операнд команды LOOP должен находиться в диапазоне от 128
(десятичное) байтов до начала команды до 127 байтов после начала
команды.
Команды LOOP обеспечивают управление итерациями и объединяют
организацию индексирования цикла с условным переходом.
Используйте команду LOOP, загружая число итераций без знака в
счетный регистр и затем помещая команду LOOP в конце
последовательности команд, подлежащих итерации. Назначение
команды LOOP это метка, указывающая на начало итерации.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0), если смещение перехода находится ведет за границы
текущего кодового сегмента.
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
     Отсутствуют
Примечание
----------
Безусловная команда LOOP выполняется дольше, чем
последовательность из двух команд, одна из которых выполняет
декремент счетного регистра, а вторая - переход, если счетчик не
равен нулю.
Все команды ветвления преобразуются для выборки в 16-разрядные
коды, независимо от адреса перехода или возможности кеширования.
-----------------------------------------------------------------
LSL  - Загрузка границы сегмента
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|0F 03 /r  LSL r16,r/m16   10/10   Загрузка: r16 <- граница сег-|
|                                  мента, селектор r/m16 (гра-  |
|                                  нулирование в байтах)        |
|0F 03 /r  LSL r32,r/m32   10/10   Загрузка: r32 <- граница сег-|
|                                  мента, селектор r/m32 (гра-  |
|                                  нулирование в байтах)        |
|0F 03 /r  LSL r16,r/m16   10/10   Загрузка: r16 <- граница сег-|
|                                  мента, селектор r/m16 (гра-  |
|                                  нулирование в страницах)     |
|0F 03 /r  LSL r32,r/m32   10/10   Загрузка: r32 <- граница сег-|
|                                  мента, селектор r/m32 (гра-  |
|                                  нулирование в страницах)     |
-----------------------------------------------------------------
Описание
--------
Команда LSL загружает регистр незашифрованной границей сегмента
и устанавливает флаг ZF, при условии, что селектор источника
видим на текущем уровне привилегированности и на уровне RPL
дескрипторной таблицы, а дескриптор имеет тип, приемлемый для
команды LSL. В противном случае флаг ZF очищается, а регистр
назначения остается без изменений. Граница сегмента загружается
значением, гранулированным в байтах. Если дескриптор имеет
границу сегмента, гранулированную в страницах, команда LSL
транслирует его в байты, прежде чем загрузить в регистр
назначения (сдвиг влево на 12 20-разрядной "сырой" границы из
дескриптора, а затем OR со значением 00000FFFH).
32-разрядные формы команды LSL записывают в 16-разрядный регистр
назначения 32-разрядную границу, гранулированную в байтах.
Дескрипторы сегментов кода и данных допустимы для команды LSL.
Допустимые типы дескрипторов специальных сегментов и шлюзов для
команды LSL приводятся в следующей таблице:
-----------------------------------------------------------------
  Тип     Имя                             Допустимо/недопустимо
-----------------------------------------------------------------
   0      Недопустимо                           Недопустимо
   1      Доступный TSS 80286                   Допустимо
   2      LDT                                   Допустимо
   3      Занятый TSS 80286                     Допустимо
   4      Шлюз вызова 80286                     Недопустимо
   5      Шлюз задачи 80286/i486                Недопустимо
   6      Шлюз ловушки 80286                    Недопустимо
   7      Шлюз прерывания 80286                 Недопустимо
   8      Недопустимо                           Допустимо
   9      Доступный TSS i486                    Допустимо
   A      Недопустимо                           Недопустимо
   B      Занятый TSS i486                      Допустимо
   C      Шлюз вызова i486                      Недопустимо
   D      Недопустимо                           Недопустимо
   E      Шлюз ловушки i486                     Недопустимо
   F      шлюз прерывания i486                  Недопустимо
-----------------------------------------------------------------
Изменяемые флаги
----------------
Флаг ZF установлен, если только селектор не является невидимым
или недопустимого типа, когда флаг ZF очищается.
Исключения защищенного режима
----------------------------------
#GP(0) в случае недопустимого исполнительного адреса операнда
памяти в сегментах CS, DS, ES, FS или GS; #SS(0) в случае
недопустимого адреса в сегменте SS; #PF(код сбоя) в случае
страничного сбоя; #AC для невыравненной ссылки к памяти при
текущем уровне привилегированности, равном 3.
Исключения режима реальных адресов
---------------------------------------
Прерывание 6; команда LSL в режиме реальных адресов не
распознается.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и в режиме реальных адресов. #AC для
невыравненной ссылки к памяти при текущем уровне
привилегированности, равном 3.
-----------------------------------------------------------------
LTR - Загрузка регистра задачи
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|0F 00 /3  LTR r/m16       20/20   Загрузка слова EA в регистр  |
|                                  задачи                       |
-----------------------------------------------------------------
Описание
--------
Команда LTR загружает регистр задачи из исходного регистра или
адреса памяти, заданного операндом. Загруженный TSS помечается
как Занятый. Переключения задачи не происходит.
Команда LTR используется только программным обеспечением
операционной системы; прикладными программами она не
используется.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0) в случае недопустимого исполнительного адреса операнда
памяти в сегментах CS, DS, ES, FS или GS; #SS(0) в случае
недопустимого адреса в сегменте SS; #GP(0), если текущий уровень
привилегированности не равен 0; #GP(селектор), если объект,
названный в селекторе источника, не является TSS или уже Занят;
#NP(селектор), если TSS помечен как "не Присутствующий"; #
PF(код сбоя) в случае страничного сбоя;
Исключения режима реальных адресов
---------------------------------------
Прерывание 6; команда LTR в режиме реальных адресов не
распознается.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и в режиме реальных адресов.
Примечание
----------
Атрибут размера операнда на эту команду не влияет.
-----------------------------------------------------------------


Яндекс цитирования