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



 

Часть 8

320
     4LEA5 - Загрузка исполнительного адреса
PЪДДДДДДДДДВДДДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДї
іКод      іКоманда       іЧисло   і  Описание                   і
іоперации і              ітактовыхі                             і
і         і              іциклов  і                             і
ГДДДДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і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          і
АДДДДДДДДДБДДДДДДДДДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
M
     Работа команды
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;
                                                 321
     Описание
    Команда  LEA   вычисляет  исполнительный   адрес
(часть его, определяющую смещение) и записывает  его
в заданный регистр. Атрибут размера операнда команды
(представленный в описании работы команды выше  име-
нем OperandSize)  определяется выбранным  регистром.
Атрибут   размера   адреса   (представленный  именем
AddressSize)  определяется  атрибутом  USE сегмента,
содержащего второй операнд. Атрибутиы размера адреса
и размера операнда  влияют на действие,  выполняемые
командой LEA, следующим образом:
P   ЪДДДДДДДДДДДДДДДВДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДДДДї
   іРазмер операндаіРазмер адресаі   Выполняемое действие        
      і
   ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДґ
   і  16           і   16        іВычисляется 16-разрядный исполн
итель-і
   і               і             іный адрес и записывается в запр
оше-  і
   і               і             інный 16-разрядный регистр назна
чения.і
   і  16           і   32        іВычисляется 32-разрядный исполн
итель-і
   і               і             іный адрес. Младшие 16 битов адр
еса   і
   і               і             ізаписываются в запрошенный 16-р
аз-   і
   і               і             ірядный регистр назначения.     
      і
   і  32           і   16        іВычисляется 16-разрядный исполн
итель-і
   і               і             іный адрес. 16-разрядный адрес р
асши- і
   і               і             іряется нулем и записывается в з
ап-   і
   і               і             ірошенный 32-разрядный регистр н
азна- і
   і               і             ічения.                         
      і
   і  32           і   32        іВычисляется 32-разрядный исполн
итель-і
   і               і             іный адрес и записывается в запр
оше-  і
   і               і             інный 32-разрядный регистр назна
чения.і
   АДДДДДДДДДДДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДЩM
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #UD, если второй операнд является регистром.
322
     Исключения режима реальных адресов
    Прерывание 6, если второй операнд является ре-
гистром.
     Исключения виртуального режима 8086
    Те же исключения, что и в режиме реальных адре-
сов.
     4LEAVE5 - Выход из процедуры высокого уровня
P    ЪДДДДДДДДДВДДДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод      іКоманда       іЧисло   і  Описание                
   і
    іоперации і              ітактовыхі                          
   і
    і         і              іциклов  і                          
   і
    ГДДДДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДґ
    іC9       іLEAVE         і  5     іУстановить SP в BP и затем
   і
    і         і              і        іизвлечь BP из стека       
   і
    іC9       іLEAVE         і  5     іУстановить ESP в EBP и зат
ем і
    і         і              і        іизвлечь EBP из стека      
   і
    АДДДДДДДДДБДДДДДДДДДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩM
     Работа команды
IF StackAddrSize = 16
THEN
  SP <- BP;
ELSE  (* StackAddrSize = 32 *)
  ESP <- EBP;
FI;
IF OperandSize = 16
THEN
  BP <- Pop();
ELSE (* OperandSize = 32 *)
  EBP <- Pop();
FI;
                                                 323
     Описание
    Команда  LEAVE  имеет  действие, противоположное
команде ENTER. Копируя  указатель кадра в  указатель
стека, команда LEAVE освобождает область стека,  ис-
пользуемую процедурой  для своих  локальных перемен-
ных. Старый указатель  кадра извлекается из  стека в
регистр BP или EBP, восстанавливая кадр стека  вызы-
вающей процедуры. Последующая команда RET nn удаляет
любые аргументы, помещенные в стек при входе в  про-
цедуру.
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #SS(0), если  регистр BP  не указывает  на адрес
памяти в границах текущего сегмента стека.
     Исключения режима реальных адресов
    Прерывание 13, если какая-либо часть извлекаемо-
го из стека операнда лежит за адресом 0FFFFH.
     Исключения виртуального режима 8086
    Те же исключения, что и в режиме реальных  адре-
сов.
324
     4LGDT/LIDT5 - Загрузка регистра таблицы дескрип-
                 торов глобальной/прерываний
P       ЪДДДДДДДДДВДДДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДД
ДДї
       іКод      іКоманда       іЧисло   і  Описание            і
       іоперации і              ітактовыхі                      і
       і         і              іциклов  і                      і
       ГДДДДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
       і0F 01 /2 іLGDT m16&32   і 11     іЗагрузка m в GDTR     і
       і0F 01 /3 іLIDT m16&32   і 11     іЗагрузка m в IDTR     і
       АДДДДДДДДДБДДДДДДДДДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДЩ
M
     Работа команды
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-раз-
рядная  база;  старшие  восемь  битов шестибайтового
операнда используются как старшие адресные биты  ба-
                                                 325
зы.
    Команды 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.
326
    Прерывание  6,  если  исходный  операнд является
регистром;
    Примечание:  Эти  команды  допустимы  в   режиме
реальных адресов, чтобы позволить инициализацию  при
включении питания для защищенного режима.
     Исключения виртуального режима 8086
    Те  же  исключения,  что  и  для режима реальных
адресов:
    #PF (код сбоя) для страничных сбоев.
     4LGS/LSS/LDS/LES/LFS5 - Загрузка полного
                           указателя
P    ЪДДДДДДДДВДДДДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод     і Команда       іЧисло   і  Описание                
   і
    іоперацииі               ітактовыхі                          
   і
    і        і               іциклов  і                          
   і
    ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДґ
    і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 указател
я  і
    і        і               і        іпамяти                    
   і
    АДДДДДДДДБДДДДДДДДДДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩM
                                                 327
P    ЪДДДДДДДДВДДДДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод     і Команда       іЧисло   і  Описание                
   і
    іоперацииі               ітактовыхі                          
   і
    і        і               іциклов  і                          
   і
    ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДґ
    і0F B5 /rіLGS r16,m16:16 і 6/12   іЗагрузка в GS:r16 указател
я  і
    і        і               і        іпамяти                    
   і
    і0F B5 /rіLGS r32,m16:32 і 6/12   іЗагрузка в GS:r32 указател
я  і
    і        і               і        іпамяти                    
   і
    АДДДДДДДДБДДДДДДДДДДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩM
     Работа команды
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 битов,
328
если этот атрибут равен 16. Этот загружаемый 16- или
32-разрядный регистр определяется заданным операндом
r16 или r32.
    Когда одному  из  сегментных  регистров  сделано
назначение,  в сегментный регистр также  загружается
дескриптор.  Данные  для  этого  регистра берутся из
элемента  дескрипторной  таблицы,   соответствующего
выбранному селектору.
    В регистры DS, ES, FS или GS может быть загружен
пустой  селектор (значения 0000 - 0003),  не вызывая
исключения защиты. (Любые последующие ссылки на сег-
мент,  соответствующий  сегментный  регистр которого
загружен пустым селектором, для адресации памяти вы-
зовут  особую  ситуацию #GP(0).  Ссылка к памяти для
такого сегмента фактически не происходит).
    Ниже приводится  листинг  проверок  и действий в
защищенном режиме, выполняемых при загрузке сегмент-
ного регистра:
IF PзагружаетсяM SS:
  IF Pселектор пустойM THEN #GP(0); FI;
  PИндекс селектора должен быть в границах его дескрипторной та
блицыM
     ELSE #GP(PселекторM);
  PRPL селектора должен быть равен CPLM ELSE #GP(Pселектор
M);
  PБайт AR должен обозначать сегмент данных, доступный для запи
сиM
     ELSE #GP(PселекторM);
  PDPL в байте AR должен быть равен CPLM ELSE #GP(Pселектор
M);
  PСегмент должен быть помечен как ПрисутствующийM
     ELSE #SS(PселекторM);
  PЗагрузка SS селектором;M
  PЗагрузка SS дескриптором;M
IF PDS, ES, FS или GS загружен не-пустым селекторомM:
  PИндекс селектора должен быть в границах его дескрипторной та
блицыM
     ELSE #GP(PселекторM);
  PБайт AR должен обозначать сегмент данных или кода, доступный
 для чтенияM
     ELSE #GP(PселекторM);
  IF Pсегмент данных или не-конформный кодовый сегментM
  THEN Pи RPL, и CPL должны быть меньше или равны DPL байта AR
M;
  ELSE #GP(PселекторM);
                                                 329
  PСегмент должен быть помечен как ПрисутствующийM
     ELSE #NP(PселекторM);
  PЗагрузка сегментного регистра селектором и битами RPLM;
  PЗагрузка сегментного регистра дескрипторомM;
IF PDS, ES, FS или GS загружен пустым селекторомM:
  PЗагрузка сегментного регистра селекторомM;
  PОчистка бита Достоверности в дескриптореM;
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #GP(0) в  случае  недопустимого  исполнительного
адреса операнда памяти в сегментах CS,  DS,  ES,  FS
или GS;
    #SS(0) в случае недопустимого адреса в  сегменте
SS;  второй операнд должен быть операндом памяти,  а
не регистром;
    #GP(0) при загрузке в SS пустого селектора;
    #PF(код сбоя) в случае страничного сбоя;
    #AC для  невыравненной ссылки к памяти при теку-
щем уровне привилегированности, равном 3.
     Исключения режима реальных адресов
    Второй операнд должен быть операндом  памяти,  а
не регистром;  Прерывание 13,  если какая-либо часть
операнда лежит вне пространства  исполнительных  ад-
ресов от 0 до 0FFFFH.
Примечание: Эти  команды допустимы в режиме реальных
    адресов, чтобы позволить инициализацию при вклю-
    чении питания для защищенного режима.
     Исключения виртуального режима 8086
    Те же исключения,  что и для режима реальных ад-
ресов:
330
    #PF (код сбоя) для страничных сбоев;
    #AC для  невыравненной ссылки к памяти при теку-
щем уровне привилегированности, равном 3.
     4LLDT5 - Загрузка локальной таблицы дескрипторов
P       ЪДДДДДДДДДВДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДД
ДДї
       іКод      іКоманда     іЧисло   і  Описание              і
       іоперации і            ітактовыхі                        і
       і         і            іциклов  і                        і
       ГДДДДДДДДДЕДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
       і0F 00 /2 іLLDT r/m16  і 11/11  іЗагрузка селектора r/m16і
       і         і            і        ів LDTR                  і
       АДДДДДДДДДБДДДДДДДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДЩ
M
     Работа команды
LDTR <- SRC;
     Описание
    Команда LLDT  загружает  регистр локальной деск-
рипторной таблицы (LDTR). Операнд-слово (операнд па-
мяти  или регистр) команды LLDT должен содержать се-
лектор в  глобальной  дескрипторной  таблице  (GDT).
Элемент  GDT  должен  представлять  собой  локальную
дескрипторную таблицу.  В этом случае LDTR  загружа-
ется этим элементом.  На регистры DS, ES, SS, FS, GS
и CS команда не влияет.  Поле LDT в сегменте состоя-
ния задачи не изменяется.
    Операнд-селектор может быть равен 0; в этом слу-
чае LDTR помечается как неДостоверный.  Все ссылки к
дескриптору (за  исключением  выполняемых  командами
LAR,  VERR,  VERW  или LSL) вызывают особую ситуацию
#GP.
    Команда LLDT  используется программным обеспече-
нием операционной системы;  прикладные программы  ее
не используют.
                                                 331
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #GP(0), если текущий уровень привилегированности
не равен 0;
    #GP (селектор),  если операнд-селектор не указы-
вает на глобальную дескрипторную таблицу,  или  если
указанный  элемент в GDT не является локальной деск-
рипторной таблицей (LDT);
    #NP(селектор), если     дескриптор     LDT    не
Присутствует;
    #GP(0) в  случае  недопустимого  исполнительного
адреса операнда памяти в сегментах CS,  DS,  ES,  FS
или GS;
    #SS(0) в случае недопустимого адреса в  сегменте
SS;
    #PF(код сбоя) в случае страничного сбоя;
     Исключения режима реальных адресов
    Прерывание 6; команда LLDT в режиме реальных ад-
ресов не распознается.
     Исключения виртуального режима 8086
    Те же исключения,  что и для режима реальных ад-
ресов (поскольку команда не распознается, она не вы-
полняется и не ведет к ссылке к памяти).
     Примечание
    Атрибут размера  операнда на эту команду не вли-
яет.
332
     4LMSW5 - Загрузка слова состояния машины
       ЪДДДДДДДДДВДДДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДї
       іКод      іКоманда       іЧисло   і  Описание            і
       іоперации і              ітактовыхі                      і
       і         і              іциклов  і                      і
       ГДДДДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
       і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;
                                                 333
    #SS(0) в случае недопустимого адреса в  сегменте
SS;
    #PF(код сбоя) в случае страничного сбоя;
     Исключения режима реальных адресов
    Прерывание 13,  если какая-либо  часть  операнда
лежит  вне  пространства исполнительных адресов от 0
до 0FFFFH.
     Исключения виртуального режима 8086
    Те же исключения,  что и для режима реальных ад-
ресов: #PF (код сбоя) для страничных сбоев.
     Примечание
    Атрибут размера  операнда на эту команду не вли-
яет.  Данная команда  обеспечивает  совместимость  с
процессором  80286;  программы  для  процессора i486
должны вместо нее использовать команду MOV CR0,  ...
. Команда LMSW не влияет на биты PG или ET, и она не
может служить для очистки бита PE.
     4LOCK5 - Префикс возбуждения сигнала LOCK#
P       ЪДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДД
ДДї
       іКод      іКоманда    іЧисло   і  Описание               і
       іоперации і           ітактовыхі                         і
       і         і           іциклов  і                         і
       ГДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДґ
       іF0       іLOCK       і    1   іВозбуждение сигнала LOCK#і
       і         і           і        ідля следующей команды    і
       АДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДЩ
M
334
     Описание
    Префикс 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 используется с командами,
не перечисленными выше в разделе "Описание";  прочие
исключения  могут генерироваться последующими (моно-
польными, или с захватом) командами.
                                                 335
     Исключения режима реальных адресов
    Прерывание 6,  если префикс LOCK используется  с
командами,  не перечисленными выше в разделе "Описа-
ние";  прочие исключения могут генерироваться после-
дующими (монопольными, или с захватом) командами.
     Исключения виртуального режима 8086
    #UD, если префикс LOCK используется с командами,
не перечисленными выше в разделе "Описание";  прочие
исключения  могут генерироваться последующими (моно-
польными, или с захватом) командами.
     4LODS/LODSB/LODSW/LODSD5 - Загрузка строкового
                              операнда
P       ЪДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДД
ДДї
       іКод      іКоманда    іЧисло     іОписание               і
       іоперации і           ітактовых  і                       і
       і         і           іциклов    і                       і
       ГДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
       іAC       іLODS m8    і  5       іЗагрузка байта         і
       і         і           і          і[(E)SI] в AL           і
       АДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДЩ
M
     Работа команды
IF
AddrSize = 16
THEN Pиспользовать SI для индекса-источникаM
ELSE (* AddressSize = 32 *)
  Pиспользовать ESI для индекса-источника;M
FI;
IF Pкоманда байтового типаM
THEN
  AL <- [Pиндекс-источникаM]; (* Загрузка байта *)
  IF DF = 0 THEN IncDec <- 1 ELSE IncDec <- -1; FI;
336
ELSE
  IF OperandSize = 16
  THEN
    AX <- [Pиндекс-источникаM]; (* Загрузка слова *)
    IF DF = 0 THEN IncDec <- 2 ELSE IncDec <- -2; FI;
  ELSE (* OperandSize = 32 *)
    EAX <- [Pиндекс-источникаM]; (* Загрузка двойного слова 
*)
    IF DF = 0 THEN IncDec <- 4 ELSE IncDec <- -4; FI;
  FI;
FI;
Pиндекс-источника <- индекс-источника + IncDecM
     Описание
    Команда 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.
                                                 337
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #GP(0) в  случае  недопустимого  исполнительного
адреса операнда памяти в сегментах CS,  DS,  ES,  FS
или GS;
    #SS(0) в  случае недопустимого адреса в сегменте
SS;
    #PF(код сбоя) в случае страничного сбоя;
    #AC для невыравненной ссылки к памяти при  теку-
щем уровне привилегированности, равном 3.
     Исключения режима реальных адресов
    Прерывание 13,  если  какая-либо  часть операнда
лежит вне пространства исполнительных адресов  от  0
до 0FFFFH.
     Исключения виртуального режима 8086
    Те же исключения,  что и для режима реальных ад-
ресов:
    #PF (код сбоя) для страничных сбоев;
    #AC для невыравненной ссылки к памяти при  теку-
щем уровне привилегированности, равном 3.
338
     4LOOP/LOOP условие5- Управление циклом при помощи
                        счетчика CX
P    ЪДДДДДДДДВДДДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод     і Команда    іЧисло     іОписание                   
   і
    іоперацииі            ітактовых  і                           
   і
    і        і            іциклов    і                           
   і
    ГДДДДДДДДЕДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДґ
    і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 
   і
    АДДДДДДДДБДДДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩM
     Работа команды
IF AddrSize = 16 THEN CountReg это CX ELSE CountReg это ECX;
FI; CountReg <- CountReg - 1;
IF PкомандаM <> LOOP
THEN
  IF (PкомандаM = LOOPE) OR (PкомандаM = LOOPZ)
  THEN BranchCond <- (ZF = 1) AND (CountReg <> 0);
  FI;
  IF (PкомандаM = LOOPNE) OR (PкомандаM = LOOPNZ)
  THEN BranchCond <- (ZF = 0) AND (CountReg <> 0);
  FI;
FI;
IF BranchCond         (* Условие перехода *)
THEN
  IF OperandSize = 16
  THEN
    IP <- IP + SignExtend(rel8);
                                                 339
  ELSE  (* OperandSize = 32 *)
    EIP <- EIP + SignExtend(rel8);
  FI;
FI;
     Описание
    Команда LOOP  декрементирует счетный регистр без
изменения любого из флагов.  Затем для  используемой
формы команды LOOP проверяются условия. Если условия
удовлетворяются,  то выполняется короткий переход  к
метке, заданной как операнд команды LOOP. Если атри-
бут размера адреса равен 16 битам, то в качестве ре-
гистра-счетчика используется регистр CX; в противном
случае используется  регистр  ECX.  Операнд  команды
LOOP  должен находиться в диапазоне от 128 (десятич-
ное) байтов до начала команды до  127  байтов  после
начала команды.
    Команды LOOP обеспечивают управление  итерациями
и  объединяют  организацию  индексирования  цикла  с
условным переходом. Используйте команду LOOP, загру-
жая число итераций без знака в счетный регистр и за-
тем помещая команду LOOP в конце  последовательности
команд, подлежащих итерации. Назначение команды LOOP
это метка, указывающая на начало итерации.
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #GP(0), если смещение перехода  находится  ведет
за границы текущего кодового сегмента.
     Исключения режима реальных адресов
    Отсутствуют
340
     Исключения виртуального режима 8086
    Отсутствуют
     Примечание
    Безусловная команда LOOP выполняется дольше, чем
последовательность из двух команд,  одна из  которых
выполняет  декремент  счетного регистра,  а вторая -
переход, если счетчик не равен нулю.
    Все команды  ветвления преобразуются для выборки
в 16-разрядные коды,  независимо от адреса  перехода
или возможности кеширования.
     4LSL5 - Загрузка границы сегмента
P    ЪДДДДДДДДДВДДДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод      іКоманда       іЧисло   і  Описание                
   і
    іоперации і              ітактовыхі                          
   і
    і         і              іциклов  і                          
   і
    ГДДДДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДґ
    і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 (гра
-  і
    і         і              і        інулирование в страницах)  
   і
    АДДДДДДДДДБДДДДДДДДДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩM
                                                 341
     Описание
    Команда 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      і      Допустимо      і
АДДДДДБДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДЩ
342
ЪДДДДДВДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДї
і Тип і Имя                  іДопустимо/недопустимоі
ГДДДДДЕДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДґ
і  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.
                                                 343
     4LTR5 - Загрузка регистра задачи
P       ЪДДДДДДДДДВДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДД
ДДї
       іКод      іКоманда  іЧисло   і  Описание                 і
       іоперации і         ітактовыхі                           і
       і         і         іциклов  і                           і
       ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
       і0F 00 /3 іLTR r/m16і 20/20  іЗагрузка слова EA в регистрі
       і         і         і        ізадачи                     і
       АДДДДДДДДДБДДДДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
M
     Описание
    Команда LTR загружает регистр задачи из исходно-
го регистра или адреса памяти,  заданного операндом.
Загруженный TSS помечается как Занятый. Переключения
задачи не происходит.
    Команда LTR   используется   только  программным
обеспечением операционной системы; прикладными прог-
раммами она не используется.
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #GP(0) в  случае  недопустимого  исполнительного
адреса операнда памяти в сегментах CS,  DS,  ES,  FS
или GS;
    #SS(0) в случае недопустимого адреса в  сегменте
SS;
    #GP(0), если текущий уровень привилегированности
не равен 0;
    #GP(селектор), если объект, названный в селекто-
ре источника, не является TSS или уже Занят;
    #NP(селектор), если   TSS   помечен   как    "не
Присутствующий";
    #PF(код сбоя) в случае страничного сбоя;
344
     Исключения режима реальных адресов
    Прерывание 6;  команда LTR в режиме реальных ад-
ресов не распознается.
     Исключения виртуального режима 8086
    Те же  исключения,  что  и в режиме реальных ад-
ресов.
     Примечание
    Атрибут размера операнда на эту команду не  вли-
яет.


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