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


строительство и ремонт http://sv-barrisol.ru/

 

Часть 10

                                                 371
     4POP5 - Извлечение слова из стека
P    ЪДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод      іКоманда    іЧисло    і Описание                   
   і
    іоперации і           ітактовых і                            
   і
    і         і           іциклов   і                            
   і
    ГДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДґ
    і8F /0    іPOP m16    і 6       іИзвлечение вершины стека и  
   і
    і         і           і         іпомещение ее в слово памяти 
   і
    і8F /0    іPOP m32    і 6       іИзвлечение вершины стека и  
   і
    і         і           і         іпомещение ее в двойное слово
   і
    і         і           і         іпамяти                      
   і
    і58+ rw   іPOP r16    і 4       іИзвлечение вершины стека и  
   і
    і         і           і         іпомещение ее в слово - регис
тр і
    і58+ rd   іPOP r32    і 4       іИзвлечение вершины стека и  
   і
    і         і           і         іпомещение ее в двойное слово
 - і
    і         і           і         ірегистр                     
   і
    і1F       іPOP DS     і 3       іИзвлечение вершины стека и  
   і
    і         і           і         іпомещение ее в регистр DS   
   і
    і07       іPOP ES     і 3       іИзвлечение вершины стека и  
   і
    і         і           і         іпомещение ее в регистр ES   
   і
    і17       іPOP SS     і 3       іИзвлечение вершины стека и  
   і
    і         і           і         іпомещение ее в регистр SS   
   і
    і0F A1    іPOP FS     і 3       іИзвлечение вершины стека и  
   і
    і         і           і         іпомещение ее в регистр FS   
   і
    і0F A9    іPOP GS     і 3       іИзвлечение вершины стека и  
   і
    і         і           і         іпомещение ее в регистр GS   
   і
    АДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩM
     Работа команды
IF StackAddrSize = 16
THEN
  IF OperandSize = 16
  THEN
    DEST <- (SS:SP); (* Копирование слова *)
    SP <- SP + 2;
  ELSE P(* OperandSize = 32 *)M
    DEST <- (SS:SP); (* Копирование двойного слова *)
    SP <- SP + 4;
372
  FI;
ELSE (* StackAddrSize = 32 *)
  IF OperandSize = 16
  THEN
    DEST <- (SS:ESP); (* Копирование слова *)
    ESP <- ESP + 2;
  ELSE (* OperandSize = 32 *)
    DEST <- (SS:ESP); (* Копирование двойного слова *)
    ESP <- ESP + 4;
  FI;
FI;
     Описание
    Команда POP заменяет текущее содержимое операнда
памяти,  регистра  или  сегментного регистра словом,
снятым с вершины стека i486,  адресуемого SS:SP (при
атрибуте  размера  адреса  16 битов) или SS:ESP (при
атрибуте размера адреса 32 бита). Указатель стека SP
получает  приращение 2 при размере операнда 16 битов
или 4 при размере операнда 32 бита. После этого ука-
затель устанавливается на новую вершину стека.
    Команда  POP  CS не является командой процессора
i486. Извлечение из стека в регистр CS осуществляет-
ся командой RET.
    Если  операнд  назначения это сегментный регистр
(DS,  ES, FS или SS), то извлекаемое из стека значе-
ние должно являться селектором.  В защищенном режиме
загрузка селектора инициирует автоматическую загруз-
ку информации дескриптора, связанной с данным селек-
тором, в скрытую часть сегментного регистра: загруз-
ка  также инициирует контроль достоверности информа-
ции селектора и дескриптора.
    Пустое  значение (0000-0003) может быть извлечен
в регистр DS,  ES,  FS или GS, не вызывая исключения
защиты. Попытка сослаться на сегмент, сегментный ре-
гистр которого был загружен пустым значением,  вызо-
вет  исключение #GP(0).  Ссылок к памяти не происхо-
дит. Сегмент при этом сохраняет пустое значение.
    Команда POP SS запрещает все прерывания, включая
                                                 373
и немаскируемые прерывания, до конца выполнения сле-
дующей команды. Это позволяет последовательное выпо-
лнение  команд  POP SS и POP eSP без опасности иметь
во время прерывания неверное состояние стека.  Одна-
ко, использование команды LSS для загрузки регистров
SS и eSP предпочтительнее.
    Загрузка сегментного регистра в защищенном режи-
ме сопровождается специальными проверками и действи-
ями, как показано в следующем листинге:
IF загружается SS:
  IF селектор пустой THEN #GP(0);
    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 #NP(PселекторM);
    PЗагрузка регистра SS селекторомM;
    PЗагрузка регистра SS дескрипторомM;
IF PDS, ES, FS ли GS загружается не-пустым селекторомM:
  PБайт AR должен задавать сегмент данных или кодовый сегмент, 
доступныйM
     Pдля записи чтения,M ELSE #GP(PселекторM);
  IF Pсегмент данных или не-конформный сегмент кодаM
  THEN PRPL и CPL должны быть меньше или равны DPL в байте ARM
;
  ELSE #GP(PселекторM);
  FI;
  PСегмент должен быть помечен как ПрисутствующийM
     ELSE #NP(PселекторM);
  PЗагрузка сегментного регистра селекторомM;
  PЗагрузка сегментного регистра дескрипторомM;
IF PDS, ES, FS или GS загружается пустым селекторомM:
  PЗагрузка сегментного регистра селекторомM;
  PОчистка бита Достоверности в невидимой части регистраM
374
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #GP,  #SS и #NP, если загружается сегментный ре-
гистр;
    #SS(0),  если текущая вершина стека не находится
в границах стекового сегмента;
    #GP(0), если назначением является сегмент, недо-
ступный для записи;
    #GP(0)  в случае  недопустимого  исполнительного
адреса операнда памяти в сегментах CS,  DS,  ES,  FS
или GS;
    #SS(0)  в случае недопустимого адреса в сегменте
SS; #PF (код сбоя) в случае страничного сбоя;
    #AC  для невыравненной ссылки к памяти при теку-
щем уровне привилегированности, равном 3.
     Исключения режима реальных адресов
    Прерывание  13,  если  какая-либо часть операнда
лежит  вне  пространства исполнительных адресов от 0
до 0FFFFH.
     Исключения виртуального режима 8086
    Те же исключения,  что и для режима реальных ад-
ресов: #PF (код сбоя) для страничных сбоев.  #AC для
невыравненной  ссылки  к памяти  при  текущем уровне
привилегированности, равном 3.
     Примечание
    Разрешены   последовательности   парных   команд
PUSH/POP, не требующие дополнительного тактового ци-
кла между ними.
                                                 375
     4POPA/POPAD5 - Извлечение из стека всех регистров
                  общего назначения
P    ЪДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод      іКоманда    іЧисло    і Описание                   
   і
    іоперации і           ітактовых і                            
   і
    і         і           іциклов   і                            
   і
    ГДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДґ
    і61       іPOPA       і 9       іИзвлечение из стека  DI,  SI
,  і
    і         і           і         і BP,  BX,  DX,  CX  и  AX   
   і
    і61       іPOPAD      і 9       іИзвлечение из стека EDI, ESI
,  і
    і         і           і         іEBP, EBX, EDX, ECX  и EAX   
   і
    АДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩM
     Работа команды
IF OperandZize = 16 (* Команда = POPA *)
THEN
  DI <-  Pop();
  SI <-  POP();
  BP <-  Pop();
  теряется <-  Pop();  (* Пропуск SP *)
  BX <-  Pop();
  DX <-  Pop();
  CX <-  Pop();
  AX <-  Pop();
ELSE (* OperandSize = 32, команда = POPAD *)
  EDI <-  Pop();
  ESI <-  POP();
  EBP <-  Pop();
  теряется <-  Pop();  (* Пропуск ESP *)
  EBX <-  Pop();
  EDX <-  Pop();
  ECX <-  Pop();
  EAX <-  Pop();
FI;
376
     Описание
    Команда  POPA извлекает из стека восемь 16-бито-
вых регистров общего назначения. Однако, значение SP
вместо  загрузки  регистра SP уничтожается.  Команда
POPA  реверсирует действие предыдущей команды PUSHA,
восстанавливая значения регистров общего назначения,
которые  они  имели перед выполнением команды PUSHA.
Первый извлекаемый регистр - это DI.
    Команда POPAD извлекает из стека восемь 32-бито-
вых  регистров общего назначения.  Однако,  значение
ESP вместо загрузки регистра ESP уничтожается. Кома-
нда  POPAD  реверсирует  действие предыдущей команды
PUSHAD, восстанавливая значения регистров общего на-
значения, которые они имели перед выполнением коман-
ды PUSHAD. Первый извлекаемый регистр - это EDI.
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #SS(0),  если начальный или конечный адрес стека
не находится в пределах стекового сегмента;  #PF(код
сбоя) в случае страничного сбоя;
     Исключения режима реальных адресов
    Прерывание  13,  если  какая-либо часть операнда
лежит  вне  пространства исполнительных адресов от 0
до 0FFFFH.
     Исключения виртуального режима 8086
    Те же исключения,  что и для режима реальных ад-
ресов:
    #PF (код сбоя) для страничных сбоев.
                                                 377
     4POPF/POPFD5 - Извлечение из стека регистров
                  FLAGS или ERFLAGS
P       ЪДДДДДДДДДВДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДД
ДДї
       іКод      іКоманда  іЧисло    і Описание                 і
       іоперации і         ітактовых і                          і
       і         і         іциклов   і                          і
       ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
       і9D       іPOPF     і 9,pm=6  іИзвлечение вершины стека ві
       і         і         і         іFLAGS                     і
       і9D       іPOPFD    і 9,pm=6  іИзвлечение вершины стека ві
       і         і         і         іEFLAGS                    і
       АДДДДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
M
     Работа команды
Флаги <- Pop();
     Описание
    Команда  POPA  снимает с вершины стека слово или
двойное  слово  и помещает  его во флаговый регистр.
Если  атрибут  размера операнда команды равен 16 би-
там,  из  стека извлекается слово,  и его содержимое
помещается  в регистр  FLAGS.  Если  атрибут размера
операнда команды равен 32 бита, из стека извлекается
двойное слово, и его содержимое помещается в регистр
EFLAGS.
    Информация  о регистрах FLAGS и EFLAGS находится
в главах 2 и 4.  Отметим,  что биты 16 и 17 регистра
EFLAGS, называемые VM и RF, соответственно, не зави-
сят от работы команды POPF и POPFD.
    Уровень  привилегированности  ввода/вывода может
быть  изменен только при выполнении на уровне приви-
легированности 0.  Флаг прерывания изменяется только
при выполнении на уровне,  как минимум равном уровню
привилегированности  ввода/вывода.  (Режим  реальных
адресов  эквивалентен уровню привилегированности 0).
Если команда POPF выполняется при недостаточном уро-
378
вне привилегированности, исключение не возникает, но
привилегированные биты не изменяются.
     Изменяемые флаги
    Все флаги, за исключением флагов VM и RF.
     Исключения защищенного режима
    #SS(0), если вершина стека не находится в преде-
лах стекового сегмента.
     Исключения режима реальных адресов
    Прерывание  13,  если  какая-либо часть операнда
лежит  вне  пространства исполнительных адресов от 0
до 0FFFFH.
     Исключения виртуального режима 8086
    Сбой  #GP(0),  если  уровень привилегированности
меньше 3, что позволяет эмуляцию.
     4PUSH5 - помещение операнда в стек
P    ЪДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДД
Дї
    іКод      іКоманда    іЧисло    і Описание                 і
    іоперации і           ітактовых і                          і
    і         і           іциклов   і                          і
    ГДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
    іFF /6    іPUSH m16   і 4       іПомещение в стек          і
    і         і           і         іслова памяти              і
    іFF /6    іPUSH m32   і 4       іПомещение в стек          і
    і         і           і         ідвойного слова памяти     і
    і50+ /r   іPUSH r16   і 1       іПомещение в стек          і
    і         і           і         іслова - регистра          і
    і50+ /r   іPUSH r32   і 1       іПомещение в стек          і
    і         і           і         ідвойного слова - регистра і
    АДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
M
                                                 379
P    ЪДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДД
Дї
    іКод      іКоманда    іЧисло    і Описание                 і
    іоперации і           ітактовых і                          і
    і         і           іциклов   і                          і
    ГДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
    і6A       іPUSH imm8  і 1       іПомещение в стек          і
    і         і           і         інепосредственного байта   і
    і68       іPUSH imm16 і 1       іПомещение в стек          і
    і         і           і         інепосредственного слова   і
    і68       іPUSH imm32 і 1       іПомещение в стек          і
    і         і           і         інепосредственного двойногоі
    і         і           і         іслова                     і
    і0E       іPUSH CS    і 3       іПомещение в стек CS       і
    і16       іPUSH SS    і 3       іПомещение в стек SS       і
    і1E       іPUSH DS    і 3       іПомещение в стек DS       і
    і06       іPUSH ES    і 3       іПомещение в стек ES       і
    і0F A0    іPUSH FS    і 3       іПомещение в стек FS       і
    і0F A8    іPUSH GS    і 3       іПомещение в стек GS       і
    АДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
     Работа команды
IF StackAddrSize = 16
THEN
  IF OperandSize = 16 THEN
    SP <- SP - 2;
    (SS:SP) <- (источник);  (* Назначение слова *)
  ELSE
    SP <- SP - 4;
    (SS:SP) <- (источник);  (* Назначение двойного слова *)
  FI;
ELSE (* StackAddrSize = 32 *)
  IF OperandSize = 16
  THEN
    ESP <- ESP - 2;
    (SS:ESP) <- (источник);  (* Назначение слова *)
  ELSE
    ESP <- ESP - 4;
    (SS:ESP) <- (источник);  (* Назначение двойного слова *)
  FI;
380
     Описание
    Команда  PUSH  декрементирует указатель стека на
2,  если  атрибут  размера операнда команды равен 16
битам;  в противном случае она декрементирует указа-
тель стека на 4. Затем команда PUSH помещает операнд
в  новую вершину стека,  на которую указывает указа-
тель стека.
    Команда PUSH ESP помещает в стек значение регис-
тра ESP,  в том виде,  который он имел до выполнения
команды. В этом состоит отличие от 8086, где команда
PUSH  SP помещает в стек новое значение (декременти-
рованное на 2).
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #SS(0),  если новое значение регистра SP или ESP
не находится в границах стекового сегмента; #GP(0) в
случае недопустимого исполнительного адреса операнда
памяти в сегментах CS,  DS,  ES, FS или GS; #SS(0) в
случае недопустимого адреса в сегменте SS;  # PF(код
сбоя) в случае страничного сбоя; #AC для невыравнен-
ной  ссылки к памяти при текущем уровне привилегиро-
ванности, равном 3.
     Исключения режима реальных адресов
    Отсутствуют:  если  регистр  SP или ESP равен 1,
процессор  переходит в режим закрытия из-за недоста-
точного размера памяти стека.
     Исключения виртуального режима 8086
    Те же исключения,  что и для режима реальных ад-
ресов: #PF (код сбоя) для страничных сбоев.  #AC для
невыравненной  ссылки  к памяти  при  текущем уровне
                                                 381
привилегированности, равном 3.
     Примечание
    При  использовании  операнда памяти команда PUSH
выполняется дольше,  чем последовательность двух ко-
манд, пересылающая операнд через регистр.
    Разрешены   последовательности   парных   команд
PUSH/POP, не требующие дополнительного тактового ци-
кла между ними.
     4PUSHA/PUSHAD5 - Помещение в стек всех регистров
                    общего назначения
P    ЪДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод      іКоманда    іЧисло   і  Описание                   
   і
    іоперации і           ітактовыхі                             
   і
    і         і           іциклов  і                             
   і
    ГДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДґ
    і60       іPUSHA      і 11     і Помещение в стек  AX,  CX,  
DX,і
    і         і           і        і BX, исходного SP, BP, SI и D
I  і
    і60       іPUSHAD     і 11     і Помещение в стек EAX, ECX, E
DX,і
    і         і           і        іEBX, исходного ESP,EBP,ESI и 
EDIі
    АДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩM
     Работа команды
IF OperandSize = 16 (* Команда = PUSHA *)
THEN
  Врем <- (SP);
  Push(AX);
  Push(CX);
  Push(DX);
  Push(BX);
  Push(Врем);
  Push(BP);
  Push(SI);
  Push(DI);
382
ELSE (* OperandSize = 32, команда = PUSHAD *)
  Врем <- (ESP);
  Push(EAX);
  Push(ECX);
  Push(EDX);
  Push(EBX);
  Push(Врем);
  Push(EBP);
  Push(ESI);
  Push(EDI);
FI;
     Описание
    Команды  PUSHA и PUSHAD помещают в стек i486 16-
или  32-битовые регистры общего назначения.  Команда
PUSHA декрементирует указатель стека (SP) на 16, что
соответствует восьми помещаемым значениям размером в
слово.  Команда PUSHAD декрементирует указател стека
(ESP)  на  32,  что  соответствует восьми помещаемым
значениям размером в двойное слово. Поскольку регис-
тры помещаются в стек в данном порядке, в новом сте-
ке они появятся в обратном порядке. Последним в стек
помещается регистр DI или EDI.
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #SS(0),  если начальный или конечный адрес стека
не находится в пределах стекового сегмента;  #PF(код
сбоя) в случае страничного сбоя;
     Исключения режима реальных адресов
    Перед  выполнением команды PUSHA или PUSHAD про-
цессор 386 DX переходит в режим закрытия при равенс-
тве регистра SP или ESP 1,  3 или 5; если регистр SP
                                                 383
или ESP равен 7, 9, 11, 13 или 15, то происходит ис-
ключение 13.
    Прерывание  13,  если  какая-либо часть операнда
лежит  вне  пространства исполнительных адресов от 0
до 0FFFFH.
     Исключения виртуального режима 8086
    Те же исключения,  что и для режима реальных ад-
ресов: #PF (код сбоя) для страничных сбоев.
     4PUSHF/PUSHFD5 - Помещение в стек флаговых
                    регистров
P       ЪДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДД
ДДї
       іКод      іКоманда    іЧисло    і Описание               і
       іоперации і           ітактовых і                        і
       і         і           іциклов   і                        і
       ГДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
       і9C       іPUSHF      і 4,pm=3  іПомещение в стек FLAGS  і
       і9C       іPUSHFD     і 4,pm=3  іПомещение в стек EFLAGS і
       АДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДЩ
M
     Работа команды
IF OperandSize = 32
THEN push(EFLAGS);
ELSE push(FLAGS);
FI;
     Описание
    Команда  PUSHF декрементирует указатель стека на
2  и копирует  регистр  FLAGS в новую вершину стека;
команда  PUSHFD декрементирует указатель стека на 4,
и  в новую  вершину стека копируется регистр EFLAGS,
384
на  которую  указывает SS:ESP.  Информацию о регистр
EFLAGS см. в главах 2 и 4.
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #SS(0),  если новое значение регистра ESP не на-
ходится в пределах стекового сегмента.
     Исключения режима реальных адресов
    Отсутствуют:  процессор переходит в режим закры-
тия из-за недостаточного размера памяти стека.
     Исключения виртуального режима 8086
    Сбой  #GP(0),  если  уровень привилегированности
меньше 3, что позволяет эмуляцию.
     4RCL/RCR/ROL/ROR5 - Циклический сдвиг
P    ЪДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод      іКоманда    іЧисло    і Описание                   
   і
    іоперации і           ітактовых і                            
   і
    і         і           іциклов   і                            
   і
    ГДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДґ
    іD0 /2    іRCL r/m8,1 і3/4      іЦиклический сдвиг 9 битов   
   і
    і         і           і         і(CF, байт r/m) влево 1  раз 
   і
    іD2 /2    іRCL r/m8,  і8-30/9-31іЦиклический сдвиг 9 битов   
   і
    і         і    CL     і         і(CF, байт r/m) влево CL раз 
   і
    іC0 /2 ib іRCL r/m8,  і8-30/9-31іЦиклический сдвиг 9 битов   
   і
    і         і    imm8   і         і(CF, байт r/m) влево imm8 ра
з  і
    іD1 /2    іRCL r/m16,1і3/4      іЦиклический сдвиг 17 битов  
   і
    і         і           і         і(CF,слово r/m) влево 1  раз 
   і
    АДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩM
                                                 385
P    ЪДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод      іКоманда    іЧисло    і Описание                   
   і
    іоперации і           ітактовых і                            
   і
    і         і           іциклов   і                            
   і
    ГДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДґ
    іD3 /2    іRCL r/m16, і8-30/9-31іЦиклический сдвиг 17 битов  
   і
    і         і    CL     і         і(CF,слово r/m) влево CL раз 
   і
    іC1 /2 ib іRCL r/m16, і8-30/9-31іЦиклический сдвиг 17 битов  
   і
    і         і    imm8   і         і(CF,слово r/m) влево imm8 ра
з  і
    іD1 /2    іRCL r/m32,1і3/4      іЦиклический сдвиг 33 битов  
   і
    і         і           і         і(CF,дв. слово r/m) влево 1 р
аз і
    іD3 /2    іRCL r/m32, і8-30/9-31іЦиклический сдвиг 33 битов  
   і
    і         і    CL     і         і(CF,дв. слово r/m) влево CL 
разі
    іC1 /2 ib іRCL r/m32, і8-30/9-31іЦиклический сдвиг 33 битов  
   і
    і         і    imm8   і         і(CF,дв слово r/m)влево imm8 
разі
    іD0 /3    іRCR r/m8,1 і3/4      іЦиклический сдвиг 9 битов   
   і
    і         і           і         і(CF, байт r/m) вправо 1  раз
   і
    іD2 /3    іRCR r/m8,  і8-30/9-31іЦиклический сдвиг 9 битов   
   і
    і         і    CL     і         і(CF, байт r/m) вправо CL раз
   і
    іC0 /3 ib іRCR r/m8,  і8-30/9-31іЦиклический сдвиг 9 битов   
   і
    і         і    imm8   і         і(CF, байт r/m) вправо imm8 р
аз і
    іD1 /3    іRCR r/m16,1і3/4      іЦиклический сдвиг 17 битов  
   і
    і         і           і         і(CF,слово r/m) вправо 1  раз
   і
    іD3 /3    іRCR r/m16, і8-30/9-31іЦиклический сдвиг 17 битов  
   і
    і         і    CL     і         і(CF,слово r/m) вправо CL раз
   і
    іC1 /3 ib іRCR r/m16, і8-30/9-31іЦиклический сдвиг 17 битов  
   і
    і         і    imm8   і         і(CF,слово r/m) вправо imm8 р
аз і
    іD1 /3    іRCR r/m32,1і3/4      іЦиклический сдвиг 33 битов  
   і
    і         і           і         і(CF,дв. слово r/m) вправо 1 
разі
    іD3 /3    іRCR r/m32, і8-30/9-31іЦиклический сдвиг 33 битов  
   і
    і         і    CL     і         і(CF,дв слово r/m) вправо CL 
разі
    іC1 /3 ib іRCR r/m32, і8-30/9-31іЦиклический сдвиг 33 битов  
   і
    і         і    imm8   і         і(CF,д.слово r/m)вправо imm8 
разі
    іD0 /0    іROL r/m8,1 і3/4      іЦиклический сдвиг 8 битов   
   і
    і         і           і         і(    байт r/m) влево 1  раз 
   і
    іD2 /0    іROL r/m8,  і3/4      іЦиклический сдвиг 8 битов   
   і
    і         і    CL     і         і(    байт r/m) влево CL раз 
   і
    іC0 /0 ib іROL r/m8,  і3/4      іЦиклический сдвиг 8 битов   
   і
    і         і    imm8   і         і(    байт r/m) влево imm8 ра
з  і
    АДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩM
386
P    ЪДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод      іКоманда    іЧисло    і Описание                   
   і
    іоперации і           ітактовых і                            
   і
    і         і           іциклов   і                            
   і
    ГДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДґ
    іD1 /0    іROL r/m16,1і3/4      іЦиклический сдвиг 16 битов  
   і
    і         і           і         і(   слово r/m) влево 1  раз 
   і
    іD3 /0    іROL r/m16, і3/4      іЦиклический сдвиг 16 битов  
   і
    і         і    CL     і         і(   слово r/m) влево CL раз 
   і
    іC1 /0 ib іROL r/m16, і3/4      іЦиклический сдвиг 16 битов  
   і
    і         і    imm8   і         і(   слово r/m) влево imm8 ра
з  і
    іD1 /0    іROL r/m32,1і3/4      іЦиклический сдвиг 32 битов  
   і
    і         і           і         і(двойное слово r/m) влево 1 
разі
    іD3 /0    іROL r/m32, і3/4      іЦиклический сдвиг 32 битов  
   і
    і         і    CL     і         і(двойное слово r/m)влево CL 
разі
    іC1 /0 ib іROL r/m32, і2/4      іЦиклический сдвиг 32 битов  
   і
    і         і    imm8   і         і(дв. слово r/m) влево imm8 р
аз і
    іD0 /1    іROR r/m8,1 і3/4      іЦиклический сдвиг 8 битов   
   і
    і         і           і         і(    байт r/m) вправо 1  раз
   і
    іD2 /1    іROR r/m8,  і3/4      іЦиклический сдвиг 8 битов   
   і
    і         і    CL     і         і(    байт r/m) вправо CL раз
   і
    іC0 /1 ib іROR r/m8,  і3/4      іЦиклический сдвиг 8 битов   
   і
    і         і    imm8   і         і(    байт r/m) вправо imm8 р
аз і
    іD1 /1    іROR r/m16,1і3/4      іЦиклический сдвиг 16 битов  
   і
    і         і           і         і(   слово r/m) вправо 1  раз
   і
    іD3 /1    іROR r/m16, і3/4      іЦиклический сдвиг 16 битов  
   і
    і         і    CL     і         і(   слово r/m) вправо CL раз
   і
    іC1 /1 ib іROR r/m16, і3/4      іЦиклический сдвиг 16 битов  
   і
    і         і    imm8   і         і(   слово r/m) вправо imm8 р
аз і
    іD1 /1    іROR r/m32,1і3/4      іЦиклический сдвиг 32 битов  
   і
    і         і           і         і(двойное слово r/m)вправо 1 
разі
    іD3 /1    іROR r/m32, і3/4      іЦиклический сдвиг 32 битов  
   і
    і         і    CL     і         і(дв. слово r/m) вправо CL ра
з  і
    іC1 /1 ib іROR r/m32, і2/4      іЦиклический сдвиг 32 битов  
   і
    і         і    imm8   і         і(дв. слово r/m)вправо imm8 р
аз і
    АДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩ
                                                 387
     Работа команды
(* ROL - циклический сдвиг влево *)
PвремM <- PсчетчикM;
WHILE(PвремM <> 0)
DO
  PвремcfM <- Pстарший бит (r/m)M;
  r/m <- r/m * 2 + (PвремcfM);
  PвремM <- PвремM - 1;
OD;
IF PсчетчикM = 1
THEN
  IF Pстарший бит r/mM <> CF
  THEN OF <- 1;
  ELSE OF <- 0;
  FI;
ELSE OF <- PнеопределеноM;
FI;
(* ROR - циклический сдвиг вправо *)
PвремM <- PсчетчикM;
WHILE(PвремM <> 0)
DO
  PвремcfM <- Pмладший бит (r/m)M;
  Pr/mM <- Pr/mM / 2 + (PвремcfM * 2 ** width(Pr/m
M));
  PвремM <- PвремM - 1;
OD;
IF PсчетчикM = 1
THEN
  IF (Pстарший бит r/mM) <> (Pбит, соседний со старшим бито
м r/mM)
  THEN OF <- 1;
  ELSE OF <- 0;
  FI;
ELSE OF <- PнеопределеноM;
FI;
388
     Описание
    Каждая команда циклического сдвига сдвигает биты
данного операнда регистра или памяти. Команда цикли-
ческого сдвига влево сдвигают все биты в верхнем на-
правлении,  за исключением самого верхнего бита, ко-
торый переходит в нижнюю позицию.  Команды цикличес-
кого сдвига выполняют обратное действие:  биты сдви-
гаются  в нижнем направлении,  пока самый нижний бит
не окажется сверху.
    В  случае  команд  RCL  и RCR  флаг  CF является
частью сдвигаемых данных.  Команда RCL сдвигает флаг
CF в нижний бит,  а верхний бит сдвигает во флаг CF;
команда RCR сдвигает флаг CF в верхний бит, а нижний
бит сдвигает во флаг CF. Для команд ROL и ROR исход-
ное значение флага CF не является частью результата,
но флаг CF получает копию бита,  который был сдвинут
с одного конца на другой.
    Сдвиг  повторяется число раз,  задаваемое вторым
операндом,  который  представляет  собой либо непос-
редственное  значение,  либо содержимое регистра CL.
Для  уменьшения максимального времени выполнения ко-
манды  процессор i486 не позволяет число циклических
сдвигов более 31.  При попытке сделать счетчик сдви-
гов  более  31  используются  только нижние 5 битов.
8086 не маскирует счетчик сдвигов. В виртуальном ре-
жиме  8086 процессор i486 не маскирует счетчик сдви-
гов.
    Флаг  OF  определен  только для однократных форм
команды (второй операнд равен 1). В остальных случа-
ях он не определен.  Для сдвигов/циклических сдвигов
влево  для бита CF после сдвига выполняется операция
XOR  с битом результата старшего порядка.  Для сдви-
гов/циклических  сдвигов вправо для двух битов стар-
шего порядка результата выполняется операция XOR для
получения флага OF.
                                                 389
     Изменяемые флаги
    Флаг  OF  изменяется только в случае циклических
сдвигов  на  1 бит;  для  сдвигов на несколько битов
флаг OF неопределен; флаг CF содержит значение бита,
который был в него помещен сдвигом; флаги SF, ZF, AF
и PF не изменяются.
     Исключения защищенного режима
    #GP(0), если назначением является сегмент, недо-
ступный  для  записи;  #GP(0) в случае недопустимого
исполнительного  адреса  операнда памяти в сегментах
CS, DS, ES, FS или GS; #SS(0) в случае недопустимого
адреса в сегменте SS; #PF(код сбоя) в случае страни-
чного  сбоя;  #AC  для невыравненной ссылки к памяти
при текущем уровне привилегированности, равном 3.
     Исключения режима реальных адресов
    Прерывание  13,  если  какая-либо часть операнда
лежит  вне  пространства исполнительных адресов от 0
до 0FFFFH.
     Исключения виртуального режима 8086
    Те же исключения,  что и для режима реальных ад-
ресов: #PF (код сбоя) для страничных сбоев.  #AC для
невыравненной  ссылки  к памяти  при  текущем уровне
привилегированности, равном 3.
390
     4REP/REPE/REPZ/REPNE/REPNZ5 - Повторение следующей
                                 строковой команды
P    ЪДДДДДДДДВДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод     і Команда    іЧисло            іОписание            
   і
    іоперацииі            ітактовых         і                    
   і
    і        і            іциклов           і                    
   і
    ГДДДДДДДВБДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДД
ДДДґ
    іF3 6C  і  REP INS    і16+8(E)CX,       іВвод (E)CX байтов из
   і
    і       і   r/m8,DX   іpm=10+8(E)CX *1/ іпорта DX в ES:[(E)DI
]  і
    і       і             і30+8(E)CX *2,    і                    
   і
    і       і             іVM=29+8(E)CX     і                    
   і
    іF3 6D  і  REP INS    і16+8(E)CX,       іВвод (E)CX слов   из
   і
    і       і  r/m16,DX   іpm=10+8(E)CX *1/ іпорта DX в ES:[(E)DI
]  і
    і       і             і30+8(E)CX *2,    і                    
   і
    і       і             іVM=29+8(E)CX     і                    
   і
    іF3 6D  і  REP INS    і16+8(E)CX,       іВвод (E)CX двойных с
лові
    і       і  r/m32,DX   іpm=10+8(E)CX *1/ із порта DX в ES:[(E)
DI]і
    і       і             і30+8(E)CX *2,    і                    
   і
    і       і             іVM=29+8(E)CX     і                    
   і
    іF3 A4  і  REP MOVS   і5 *3, 13 *4,     іПересылка (E)CX байт
ов і
    і       і  m8,m8      і12+3(E)CX *5     іиз [(E)SI] в ES:[(E)
DI]і
    іF3 A5  і  REP MOVS   і5 *3, 13 *4,     іПересылка (E)CX слов
   і
    і       і  m16,m16    і12+3(E)CX *5     іиз [(E)SI] в ES:[(E)
DI]і
    іF3 A5  і  REP MOVS   і5 *3, 13 *4,     іПересылка (E)CX двой
ныхі
    і       і  m32,m32    і12+3(E)CX *5     іслов                
   і
    і       і             і                 іиз [(E)SI] в ES:[(E)
DI]і
    іF3 6E  і  REP OUTS   і17+5(E)CX,       іВывод (E)CX байтов и
з  і
    і       і  DX,r/m8    іpm=11+5(E)CX *1/ і[(E)SI] в порт DX   
   і
    і       і             і31+5(E)CX *2,    і                    
   і
    і       і             іVM=30+5(E)CX     і                    
   і
    іF3 6F  і  REP OUTS   і17+5(E)CX,       іВывод (E)CX слов   и
з  і
    і       і  DX,r/m16   іpm=11+5(E)CX *1/ і[(E)SI] в порт DX   
   і
    і       і             і31+5(E)CX *2,    і                    
   і
    і       і             іVM=30+5(E)CX     і                    
   і
    іF3 6F  і  REP INS    і17+5(E)CX,       іВывод (E)CXдвойных с
лові
    і       і  DX,r/m32   іpm=11+5(E)CX *1/ із [(E)SI] в порт DX 
   і
    і       і             і31+5(E)CX *2,    і                    
   і
    і       і             іVM=30+5(E)CX     і                    
   і
    АДДДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДД
ДДДЩM
                                                 391
P    ЪДДДДДДДДВДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод     і Команда    іЧисло            іОписание            
   і
    іоперацииі            ітактовых         і                    
   і
    і        і            іциклов           і                    
   і
    ГДДДДДДДВБДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДД
ДДДґ
    іF2 AC  і  REP LODS   і5 *3,            іЗагрузка  (E)CX байт
ов і
    і       і  m8         і7 +4(E)CX *6     іиз [(E)SI] в AL     
   і
    іF2 AD  і  REP LODS   і5 *3,            іЗагрузка  (E)CX слов
   і
    і       і  m16        і7 +4(E)CX *6     іиз [(E)SI] в AX     
   і
    іF2 AD  і  REP LODS   і5 *3,            іЗагрузка  (E)CX двой
ныхі
    і       і  m32        і7 +4(E)CX *6     іслов                
   і
    і       і             і                 іиз [(E)SI] в EAX    
   і
    іF3 AA  і  REP STOS   і5 *3,            іЗаполнение(E)CX байт
ов і
    і       і  m8         і7 +4(E)CX *6     ів ES:[(E)DI] из AL  
   і
    іF3 AB  і  REP STOS   і5 *3,            іЗаполнение(E)CX слов
   і
    і       і  m16        і7 +4(E)CX *6     ів ES:[(E)DI] из AX  
   і
    іF3 AB  і  REP STOS   і5 *3,            іЗаполнение(E)CX двой
ныхі
    і       і  m32        і7 +4(E)CX *6     іслов                
   і
    і       і             і                 ів ES:[(E)DI] из EAX 
   і
    іF3 A6  і REPE CMPS   і5 *3,            іПоиск несовпадающих 
   і
    і       і  m8,M8      і7 +7(E)CX *6     ібайтов              
   і
    і       і             і                 ів ES:[(E)DI] и [(E)S
I] і
    іF3 A7  і REPE CMPS   і5 *3,            іПоиск несовпадающих 
   і
    і       і  m16,m16    і7 +7(E)CX *6     іслов                
   і
    і       і             і                 ів ES:[(E)DI] и [(E)S
I] і
    іF3 A7  і REPE CMPS   і5 *3,            іПоиск несовпадающих 
   і
    і       і  m32,m32    і7 +7(E)CX *6     ідвойных слов        
   і
    і       і             і                 ів ES:[(E)DI] и [(E)S
I] і
    іF3 AE  і REPE SCAS   і5 *3,            іПоиск не равных     
AL і
    і       і  m8         і7 +5(E)CX *6     ібайтов, начиная с   
   і
    і       і             і                 і  ES:[(E)DI]        
   і
    іF3 AF  і REPE SCAS   і5 *3,            іПоиск не равных     
AX і
    і       і  m16        і7 +5(E)CX *6     іслов  , начиная с   
   і
    і       і             і                 і  ES:[(E)DI]        
   і
    іF3 AF  і REPE SCAS   і5 *3,            іПоиск не равных     
EAXі
    і       і  m32        і7 +5(E)CX *6     ідвойных слов, начина
я сі
    і       і             і                 і  ES:[(E)DI]        
   і
    іF2 A6  іREPNE CMPS   і5 *3,            іПоиск   совпадающих 
   і
    і       і  m8,M8      і7 +7(E)CX *6     ібайтов              
   і
    і       і             і                 ів ES:[(E)DI] и [(E)S
I] і
    АДДДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДД
ДДДЩM
392
P    ЪДДДДДДДДВДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод     і Команда    іЧисло            іОписание            
   і
    іоперацииі            ітактовых         і                    
   і
    і        і            іциклов           і                    
   і
    ГДДДДДДДВБДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДД
ДДДґ
    іF2 A7  іREPNE CMPS   і5 *3,            іПоиск   совпадающих 
   і
    і       і  m16,m16    і7 +7(E)CX *6     іслов                
   і
    і       і             і                 ів ES:[(E)DI] и [(E)S
I] і
    іF2 A7  іREPNE CMPS   і5 *3,            іПоиск   совпадающих 
   і
    і       і  m32,m32    і7 +7(E)CX *6     ідвойных слов        
   і
    і       і             і                 ів ES:[(E)DI] и [(E)S
I] і
    іF2 AE  іREPNE SCAS   і5 *3,            іПоиск    равных     
AL і
    і       і  m8         і7 +5(E)CX *6     ібайтов, начиная с   
   і
    і       і             і                 і  ES:[(E)DI]        
   і
    іF2 AF  іREPNE SCAS   і5 *3,            іПоиск    равных     
AX і
    і       і  m16        і7 +5(E)CX *6     іслов  , начиная с   
   і
    і       і             і                 і  ES:[(E)DI]        
   і
    іF2 AF  іREPNE SCAS   і5 *3,            іПоиск    равных     
EAXі
    і       і  m32        і7 +5(E)CX *6     ідвойных слов, начина
я сі
    і       і             і                 і  ES:[(E)DI]        
   і
    АДДДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДД
ДДДЩM
Примечания:  *1  если CPL <= IOPL
             *2  если CPL > IOPL
             *3  (E)CX = 0
             *4  (E)CX = 1
             *5  (E)CX > 1
             *6  (E)CX > 0
     Работа команды
IF AddressSize = 16
THEN в качестве CountReg используется CX;
ELSE (* AddressSize = 32 *) в качестве CountReg используется EC
X;
FI;
WHILE CountReg <> 0
DO
  Pобслуживание подвешенных прерываний (если они есть)M;
  Pвыполнение примитивной строковой команды;
  CountReg <- CountReg - 1;
                                                 393
  IF Pпримитивная операция это CMPB, CMPW, SCAB или SCAWM
  THEN
    IF (PкомандаM REP/REPE/REPZ) AND (ZF=1)
    THEN Pвыход из цикла WHILEM
    ELSE
      IF (Pкоманда REPNZ или REPNEM) AND (ZF=0)
      THEN Pвыход из цикла WHILEM;
      FI;
    FI;
  FI;
OD;
     Описание
    Префиксы  REP,  REPE  (повторять  пока  равно) и
REPNE  (повторять пока не равно) применяются в стро-
ковых операциях.  Каждый префикс вызывает повторение
следующей  за  ним  строковой  команды  столько раз,
сколько указано счетным регистром или (для префиксов
REPE и REPNE) пока не перестанет удовлетворяться ус-
ловие, указанное флагом ZF.
    Синонимическими  формами  префиксов REPE и REPNE
являются префиксы REPZ и REPNZ, соответственно.
    Префиксы  REP  одновременно применяются только к
одной строковой команде. Для повторения блока команд
используйте команду LOOP или другую конструкцию цик-
ла.
    Точное  описание  действий  при  каждой итерации
следущее:
    1. Если атрибут размера адреса равен 16 битам, в
качестве регистра-счетчика используется CX;  Если же
атрибут  размера  адреса равен 32 битам,  в качестве
регистра-счетчика используется ECX;
    2. Проверяется регистр CX. Если он равен 0, про-
исходит  выход из итерации и переход к следующей ко-
манде.
    3. Уведомление о любых подвешенных прерываниях.
    4. Однократное выполнение строковой операции.
    5.  Декремент  регистра  CX  или ECX на единицу;
флаги не модифицируются.
394
    6.  Если  строковая  команда  это SCAS или CMPS,
проверяется флаг ZF. Если условие повтоения не выпо-
лняется, то происходит выход из итерации и переход к
следующей команде. Выход из итерации происходит, ес-
ли  префикс  это REPE,  а флаг ZF равен 0 (последнее
сравнение  показало неравенство),  либо если префикс
это  REPNE,  а  флаг ZF равен 1 (последнее сравнение
показало равенство).
    7. Возврат к шагу 1 для следующей итерации.
    Выход из повторяющихся команд CMPS и SCAS возмо-
жен,  когда  либо счетчик отсчитал нужное число раз,
либо флаг ZF показал,  что условие повторения не вы-
полняется. Эти два случая можно различить, используя
для этого либо команду JCXZ, либо условные переходы,
проверяющие флаг ZF (команды JZ, JNZ и JNE).
     Изменяемые флаги
    Флаг  ZF изменяется конструкциями REP CMPS и REP
SCAS, как было описано выше.
     Исключения защищенного режима
    Отсутствуют
     Исключения режима реальных адресов
    Отсутствуют
     Исключения виртуального режима 8086
    Отсутствуют
     Примечание
    Не  все порты ввода/вывода способны поддерживать
скорость,  с  которой  выполняются команды REP INS и
REP OUTS.
    При  использовании  с не-строковой командой пре-
фикс повторения игнорируется.
                                                 395
     4RET5 - Возврат из процедуры
P    ЪДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДї
    іКод      іКоманда    іЧисло    і Описание                   
   і
    іоперации і           ітактовых і                            
   і
    і         і           іциклов   і                            
   і
    ГДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДґ
    іC3       і RET       і5        іВозврат (ближний) в         
   і
    і         і           і         івызывающую процедуру        
   і
    іCB       і RET       і13,pm=18 іВозврат (дальний) в         
   і
    і         і           і         івызывающую процедуру,       
   і
    і         і           і         іта же привилегированность   
   і
    іCB       і RET       і13,pm=33 іВозврат (дальний)           
   і
    і         і           і         іменьшая привилегированность,
   і
    і         і           і         істеки переключения задач    
   і
    іC2 iw    і RET imm16 і5        іВозврат (дальний),          
   і
    і         і           і         іизвлечение из стека imm16   
   і
    і         і           і         ібайтов параметров           
   і
    іCA iw    і RET imm16 і14,pm=17 іВозврат (дальний),          
   і
    і         і           і         іта же привилегированность,  
   і
    і         і           і         іизвлечение из стека imm16   
   і
    і         і           і         ібайтов                      
   і
    іCA iw    і RET imm16 і14,pm=33 іВозврат (дальний),          
   і
    і         і           і         іменьшая привилегированность,
   і
    і         і           і         іизвлечение из стека imm16   
   і
    і         і           і         ібайтов                      
   і
    АДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩM
     Работа команды
IF PкомандаM = Pближний RETM
THEN
  IF OperandSize = 16
  THEN
    IP <- Pop();
    EIP <- EIP AND 0000FFFFH;
  ELSE (* OperandSize = 32 *)
    EIP <- Pop();
  FI;
  IF Pв команде задан непосредственный операндM
    THEN eSP <- eSP + imm16; FI;
FI;
396
IF (PE = 0 OR (PE = 1 AND VM = 1))
   (* режим реальных адресов или виртуальный режим 8086 *)
   AND PкомандаM = Pдальний RETM
  THEN
    IF OperandSize = 16
    THEN
      IP <- Pop();
      EIP <- EIP AND 0000FFFFH;
      CS <- Pop(); (* Извлечение из стека 16 битов *)
    ELSE (* OperandSize = 32 *)
      EIP <- Pop();
      CS <- Pop(); P(* извлечение из стека 32 битов, 16 битов т
еряются *)M
    FI;
    IF Pв команде задан непосредственный операндM
       THEN eSP <- eSP + imm16; FI;
FI;
IF (PE = 1 AND VM = 0)
   (* Защищенный режим, не виртуальный режим 8086 *)
   AND PкомандаM = Pдальний RETM
  THEN
    IF OperandSize = 16
    THEN Pтретье слово в стеке должно находиться в границах сте
ка иначе #SS(0)M;
    ELSE Pвторое слово в стеке должно находиться в границах сте
ка иначе #SS(0)M;
    FI;
    PRPL селектора возврата должен бытьM >= CPL
         ELSE #GP(Pселектор возвратаM);
    IF PRPL селектора возвратаM = CPL
    THEN GOTO PТОТ-ЖЕ-УРОВЕНЬM;
    ELSE GOTO PВНЕШНИЙ-УРОВЕНЬ-ПРИВИЛЕГИРОВАННОСТИM;
    FI;
FI;
PТОТ-ЖЕ-УРОВЕНЬM:
  PСелектор возврата должен быть не-пустымM ELSE #GP(0)
  PИндекс селектора должен быть в границах его таблицы дескрипт
оров,M
     ELSE #GP(PселекторM);
  PБайт AR дескриптора должен задавать кодовый сегмент,M
     ELSE #GP(PселекторM);
                                                 397
  IF Pне-конформныйM
  THEN  PDPL кодового сегмента должен быть равен CPLM;
  ELSE #GP(PселекторM);
  FI;
  IF PконформныйM
  THEN  PDPL кодового сегмента должен бытьM <= CPL;
      ELSE #GP(PселекторM);
  FI;
  PКодовый сегмент должен ПрисутствоватьM ELSE #NP(селектор);
  PВерхнее слово в стеке должно быть в границах стекаM
     ELSE #SS(0);
  PIP должен быть в границах кодового сегментаM ELSE #GP(0);
  IF OperandSize = 32
  THEN
    PЗагрузка CS:EIP из стекаM
    PЗагрузка регистра CS дескрипторомM
    PИнкремент eSP на 4 плюс непосредственное значение смещения
,M
       Pесли оно существуетM
  FI;
PВНЕШНИЙ-УРОВЕНЬ-ПРИВИЛЕГИРОВАННОСТИM:
  IF OperandSize = 32
  THEN PВерхние (16+непосредственное значение) байтов в стеке д
олжны бытьM
     Pв пределах границ стека, иначе #SS(0)M;
  ELSE PВерхние (8+непосредственное значение) байтов в стеке до
лжны бытьM
     Pв пределах границ стека, иначе #SS(0)M;
  FI;
  PРассмотрим селектор  CS возврата и связанный с ним дескрипто
рM:
    PСелектор должен быть не-пустым, иначе #GP(0);
    PИндекс  селектора должен быть в границах его таблицы дескр
ипторов,M
       ELSE #GP(PселекторM);
    PБайт AR дескриптора должен задавать кодовый сегмент,M
       ELSE #GP(PселекторM);
    IF Pне-конформныйM
    THEN PDPL кодового сегмента должен быть = RPL селектора возв
рата;M
       ELSE #GP(PселекторM);
    FI;
    IF PконформныйM
    THEN PDPL кодового сегмента должен быть <= RPL селектора во
зврата,M
       ELSE #GP(PселекторM);
398
    FI;
    PСегмент должен присутствовать, иначеM #NP(PселекторM
);
  PРассмотрим селектор SS возврата и связанный с ним дескриптор
M:
    PСелектор должен быть не-пустым, иначе #GP(0);M
    PИндекс селектора должен быть в границах его таблицы дескри
пторов,M
       ELSE #GP(PселекторM);
    PRPL селектора должен быть равен RPL селектора CS возврата
M
       ELSE #GP(PселекторM);
    PБайт AR дескриптора должен задавать сегмент данных, доступ
ный для записи,M
       ELSE #GP(PселекторM);
    PDPL дескриптора должен бытьM = PRPL селектора CS возвр
атаM;
       ELSE #GP(PселекторM);
    PСегмент должен присутствовать, иначеM #NP(PселекторM
);
    PУказатель команд должен быть в пределах границ кодового се
гмента,M
       ELSE #GP(0);
    PУстановка CPL равным RPL селектора CS возвратаM;
    IF OperandMode = 32
    THEN
      PЗагрузка CS:EIP из стекаM;
      PУстановка RPL CS равным CPLM;
      PИнкремент eSP на 8 плюс непосредственное значение смещен
ия,M
         Pесли оно существуетM;
      PЗагрузка SS:eSP из стекаM;
    ELSE (* OperandMode *)
      PЗагрузка CS:IP из стекаM;
      PУстановка RPL CS равным CPLM;
      PИнкремент eSP на 4 плюс непосредственное значение смещен
ия, еслиM
         Pоно существуетM;
      PЗагрузка SS:eSP из стекаM;
    FI;
    PЗагрузка регистра CS дескриптором CS возвратаM;
    PЗагрузка регистра SS дескриптором SS возвратаM;
    FOR Pкаждого из ES, FS, GS и DSM
    DO;
      IF Pтекущее значение регистра недостоверно для внешнего у
ровня,M
         Pрегистр устанавливается пустым (селектор <- AR <- 0)
M;
      PЧтобы быть достоверным, установка регистра должна удовле
творятьM
         Pследующим свойствамM:
                                                 399
        PИндекс селектора должен быть в границах его таблицыM
           PдескрипторовM;
        PБайт AR дескриптора должен задавать сегмент данных или
M
           Pкодовый сегмент, доступный для чтенияM;
        IF Pэто сегмент данных или не-конформный кодовый сегмен
т,M
          THEN PDPL должен быть >= CPL, или DPL должен быть >= 
RPLM;
        FI;
  OD;
     Описание
    Команда RET передает управление на адрес возвра-
та,  находящийся в стеке.  Адрес обычно помещается в
стек командой CALL, а возврат выполняется к команде,
расположенной после команды CALL.
    Необязательный числовой параметр команды RET оп-
ределяет  число  байтов  (operandMode = 16) или слов
(OperandMode = 32),  которые должны быть освобождены
после извлечения из стека адреса возврата.  Эти эле-
менты  обычно используются как входные параметры вы-
зываемой процедуры).
    Для  внутрисегментного (ближнего) возврата адрес
в стеке это смещение сегмента,  извлекаемое из стека
и помещаемое в указатель команд. Регистр CS не изме-
няется. Для межсегментного (дальнего) возврата адрес
в стеке это длинный указатель. Сначала из стека изв-
лекается смещение, а за ним селектор.
    В  реальном  режиме регистры CS и IP загружаются
прямо. В защищенном режиме межсегментный возврат за-
ставляет процессор проверить дескриптор,  адресуемый
селектором возврата. Байт AR дескриптора должен обо-
значать кодовый сегмент, равный или менее привилеги-
рованный (с большим или равным числовым номером уро-
вня  привилегированности),  нежели  текущий  уровень
привилегированности. Возврат на меньший уровень при-
вилегированности вызывает перезагрузку стека из зна-
чения, записанного после блока параметров.
400
    Во время меж-уровневой передачи управления кома-
нда RET может очистить регистры DS, ES, FS и GS. Ес-
ли  эти  регистры относятся к сегментам,  которые не
могут быть использованы на новом уровне привилегиро-
ванности, они очищаются, чтобы предупредить неразре-
шенный доступ с нового уровня привилегированности.
     Изменяемые флаги
    Отсутствуют
     Исключения защищенного режима
    #GP,  #NP  или  #SS,  как указано выше в разделе
"Работа команды"; # PF(код сбоя) в случае странично-
го сбоя;
     Исключения режима реальных адресов
    Прерывание 13, если какая-либо часть извлекаемо-
го из стека операнда лежит за адресом 0FFFFH.
     Исключения виртуального режима 8086
    Те же исключения,  что и для режима реальных ад-
ресов: #PF (код сбоя) для страничных сбоев.


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