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


Для вас в нашей организации остекление балкона предлагаем всем желающим.

 

Часть 36

MOV - Пересылка данных
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|88 /r     MOV r/m8,r8      1      Пересылка байтового регистра |
|                                  в байт r/m                   |
|89 /r     MOV r/m16,r16    1      Пересылка регистра - слова   |
|                                  в слово r/m                  |
|89 /r     MOV r/m32,r32    1      Пересылка регистра - двойного|
|                                  слова в двойное слово r/m    |
|8A /r     MOV r8,r/m8      1      Пересылка байта r/m          |
|                                  в байтовый регистр           |
|8B /r     MOV r16,r/m16    1      Пересылка слова r/m          |
|                                  в регистр - слово            |
|8B /r     MOV r32,r/m32    1      Пересылка двойного слова r/m |
|                                  в регистр - двойное слово    |
|8C /r     MOV r/m16,Sreg   3/3    Пересылка сегментного        |
|                                  регистра в слово r/m         |
|8E /r     MOV Sreg,r/m16   3/9    Пересылка слова r/m          |
|                                  в сегментный регистр         |
|A0        MOV AL,moffs8    1      Пересылка байта в            |
|                                  (сегмент:смещение) в AL      |
|A1        MOV AX,moffs16   1      Пересылка слова в            |
|                                  (сегмент:смещение) в AX      |
|A1        MOV EAX,moffs32  1      Пересылка двойного слова в   |
|                                  (сегмент:смещение) в EAX     |
|A2        MOV moffs8, AL   1      Пересылка AL  в              |
|                                  (сегмент:смещение)           |
|A3        MOV moffs16,AX   1      Пересылка AX  в              |
|                                  (сегмент:смещение)           |
|A3        MOV moffs32,EAX  1      Пересылка EAX в              |
|                                  (сегмент:смещение)           |
|B0 + rb   MOV reg8,imm8    1      Пересылка непосредственного  |
|                                  байта в регистр              |
|B8 + rw   MOV reg16,imm16  1      Пересылка непосредственного  |
|                                  слова в регистр              |
|B8 + rd   MOV reg32,imm32  1      Пересылка непосредственного  |
|                                  двойного слова в регистр     |
|C6        MOV r/m8,imm8    1      Пересылка непосредственного  |
|                                  байта в байт r/m             |
|C7        MOV r/m16,imm16  1      Пересылка непосредственного  |
|                                  слова в слово r/m            |
|C7        MOV r/m32,imm32  1      Пересылка непосредственного  |
|                                  двойного слова в             |
|                                  двойное  слово в r/m         |
-----------------------------------------------------------------
Примечания: moffs8, moffs16 и moffs32 состоят из простого
смещения относительно базы сегмента. 8, 16 и 32 обозначают
размер данных. Атрибут размера адреса команды определяет размер
смещения, 16 или 32 бита.
Работа команды
--------------
DEST <- SRC;
Описание
--------
Команда MOV копирует второй операнд в первый.
Если операнд назначения это сегментный регистр (DS, ES, SS и
т.д.), то в регистр также загружаются данные из дескриптора.
Данные для регистра берутся из элемента дескрипторной таблицы,
соответствующего селектору. Пустой селектор (значения 0000-0003)
может быть загружен в регистры DS и ES, не вызывая исключения;
однако, использование регистров DS или ES вызовет особую
ситуацию #GP(0), и ссылка к памяти не произойдет.
Команда MOV пересылки в SS запрещает все прерывания до конца
выполнения следующей команды (которая чаще всего является
командой MOV в ESP).
Загрузка сегментного регистра в защищенном режиме приводит к
специальным проверкам и действиям, как описано в следующем
листинге:
IF SS загружен;
THEN
  IF селектор пустой THEN #GP(0);
FI;
  Индекс селектора  должен  быть  в  границах  его  дескрипторной
      таблицы иначе #GP(селектор);
  RPL селектора должен быть равен CPL иначе #GP(селектор);
Байт AR должен обозначать сегмент данных,  доступный для записи
      иначе #GP(селектор);
  DPL в байте AR должен быть равен CPL иначе #GP(селектор);
  Сегмент должен   быть   отмечен   как   Присутствующий  иначе
    #SS(селектор);
  Загрузка SS селектором;
  Загрузка SS дескриптором;
FI;
IF DS, ES, FS или GS загружен не-пустым селектором;
THEN
  Индекс селектора  должен  быть  в  границах  его  дескрипторной
      таблицы иначе #GP(селектор);
  Байт AR должен обозначать сегмент данных или кодовый сегмент,
      доступный для чтения иначе #GP(селектор);
  IF сегмент данных или не-конформный кодовый сегмент
  THEN и RPL, и CPL должны быть меньше или равны DPL в байте AR;
  ELSE #GP(селектор);
  FI;
  Сегмент должен   быть   отмечен   как   Присутствующий  иначе
    #NP(селектор);
  Загрузка сегментного регистра селектором;
  Загрузка сегментного регистра дескриптором;
FI;
IF DS, ES, FS или GS загружен пустым селектором;
THEN
  Загрузка сегментного регистра селектором;
  Очистка бита Достоверности дескриптора;
FI;
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP, #SS и #NP, если загружается сегментный регистр; #GP(0),
если назначением является сегмент, недоступный для записи;
#GP(0) в случае недопустимого исполнительного адреса операнда
памяти в сегментах CS, DS, ES, FS или GS; #SS(0) в случае
недопустимого адреса в сегменте SS; #PF(код сбоя) в случае
страничного сбоя; #AC для невыравненной ссылки к памяти при
текущем уровне привилегированности, равном 3.
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев. #AC для невыравненной ссылки к
памяти при текущем уровне привилегированности, равном 3.
-----------------------------------------------------------------
MOV - Пересылка данных в специальные регистры и из них
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|0F 22 /r  MOV CR0,r32      16     Пересылка (регистра) в       |
|                                  управляющий регистр          |
|0F 20 /r  MOV r32,CR0/     4      Пересылка (управляющего реги-|
|              CR1/CR2             стра) в (регистр)            |
|0F 22 /r  MOV CR2/CR3,r32  4      Пересылка (регистра) в       |
|                                  (управляющий регистр)        |
|0F 21 /r  MOV r32,DR0 - 3  10     Пересылка (отладочного реги- |
|                                  стра) в (регистр)            |
|0F 21 /r  MOV r32,DR6/DR7  10     Пересылка (отладочного реги- |
|                                  стра) в (регистр)            |
|0F 23 /r  MOV DR0 - 3,r32  11     Пересылка (регистра) в       |
|                                  (отладочный регистр)         |
|0F 23 /r  MOV DR6/DR7,r32  11     Пересылка (регистра) в       |
|                                  (отладочный регистр)         |
|0F 24 /r  MOV r32,TR4/TR5/ 4      Пересылка (тестового реги-   |
|              TR6/TR7             стра) в (регистр)            |
|0F 26 /r  MOV TR4/TR5/TR6/        Пересылка (регистра)         |
|              TR7,r32             в (тестовый регистр)         |
|0F 24 /r  MOV r32,TR3      4      Пересылка (тестового реги-   |
|                                  стра3) в (регистр)           |
|0F 26 /r  MOV TR3,r32      6      Пересылка (регистра)         |
|                                  в (тестовый  регистр3)       |
-----------------------------------------------------------------
Работа команды
--------------
DEST <- SRC;
Описание
--------
Показанные выше формы команды MOV сохраняют или загружают
следующие специальные регистры в/из регистров общего назначения:
     - Управляющие регистры CR0, CR2 и CR3
     - Отладочные регистры DR0, DR1, DR2, DR3, DR6 и DR7
     - Тестовые регистры TR3, TR4, TR5, TR6 и TR7
С этими командами всегда используются 32-разрядные операнды,
независимо от атрибута размера операнда.
Изменяемые флаги
----------------
Флаги OF, SF, ZF, AF, PF и CF неопределены.
Исключения защищенного режима
----------------------------------
#GP, если текущий уровень привилегированности не равен 0.
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
#GP(0) при попытке выполнения команды.
Примечания
----------
Команды должны выполняться на уровне привилегированности 0 в
режиме реальных адресов; в противном случае возникает исключение
защиты.
Поле reg в байте ModR/M задает, какой из специальных регистров в
каждой категории участвует. Два бита поля mod всегда равны 11.
Поле r/m задает участвующий регистр общего назначения.
Неопределенным или зарезервированным битам всегда должны быть
присвоены состояния, в которых они находились при предыдущем
считывании.
-----------------------------------------------------------------
MOVS/MOVSB/MOVSW/MOVSD - Пересылка данных из строки в строку
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|A4        MOVS m8,m8       7      Пересылка байта              |
|                                  [(E)SI] в ES:[(E)DI]         |
|A5        MOVS m16,m16     7      Пересылка слова              |
|                                  [(E)SI] в ES:[(E)DI]         |
|A5        MOVS m32,m32     7      Пересылка двойного слова     |
|                                  [(E)SI] в ES:[(E)DI]         |
|A4        MOVSB            7      Пересылка байта              |
|                                  DS:[(E)SI] в ES:[(E)DI]      |
|A5        MOVSW            7      Пересылка слова              |
|                                  DS:[(E)SI] в ES:[(E)DI]      |
|A5        MOVSD            7      Пересылка двойного слова     |
|                                  DS:[(E)SI] в ES:[(E)DI]      |
-----------------------------------------------------------------
Работа команды
--------------
IF (команда = MOVSD) OR (команда имеет операнды -двойные слова)
THEN OperandSize <- 32;
ELSE OperandSize <- 16;
IF AddressSize = 16
THEN использовать    SI    как    индекс-источника   и   DI   как
         индекс-назначения;
ELSE (* AddressSize = 32 *)
  использовать   ESI    как    индекс-источника   и   EDI   как
         индекс-назначения;
FI;
IF байтовый тип команды
THEN
  [индекс-назначения] <- [индекс-источника];(* Назначение байта *
  IF DF = 0 THEN IncDec <- 1 ELSE IncDec <- -1; FI;
ELSE
  IF OperandSize = 16
  THEN
    [индекс-назначения] <- [индекс-источника];(*Назначение слова*
    IF DF = 0 THEN IncDec <- 2 ELSE IncDec <- -2; FI;
  ELSE
    [индекс-назначения] <- [индекс-источника];(*Назначение
                                                двойного слова*)
    IF DF = 0 THEN IncDec <- 4 ELSE IncDec <- -4; FI;
  FI;
FI;
индекс-источника <- индекс-источника + IncDec;
индекс-назначения <- индекс-назначения + IncDec;
Описание
--------
Команда MOVS копирует байт или слово из [(E)SI] в байт или слово
в ES:[(E)DI]. Операнд назначения должен адресоваться из регистра
ES: переопределение сегмента для операнда назначения невозможно.
Переопределение сегмента может быть использовано для
операнда-источника (исходного операнда): по умолчанию
принимается регистр DS.
Адрес операндов источника и назначения определяется
исключительно содержимым регистров (E)SI и (E)DI. Перед
выполнением команды MOVS вы должны загрузить в регистры (E)SI и
(E)DI правильные значения. Команды MOVS, MOVSW и MOVSD являются
синонимами команды MOVS для работы с байтами, словами и двойными
словами, соответственно.
После пересылки данных происходит автоматическое продвижение
регистров (E)SI и (E)DI. Если флаг DF равен 0 (была выполнена
команда CLD), то выполняется инкремент регистров; если же флаг
DF равен 1 (была выполнена команда STD), то выполняется
декремент регистров. Регистры инкрементируются или
декрементируются на единицу, если выполнялась пересылка байта,
на 2, если выполнялась пересылка слова, и на 4 - двойного слова.
Команде MOVS может предшествовать префикс REP для пересылки
сразу CX байтов или слов. Подробности об этом см. в описании
префикса REP.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0), если назначением является сегмент, недоступный для
записи; #GP(0) в случае недопустимого исполнительного адреса
операнда памяти в сегментах CS, DS, ES, FS или GS; #SS(0) в
случае недопустимого адреса в сегменте SS; #PF(код сбоя) в
случае страничного сбоя; #AC для невыравненной ссылки к памяти
при текущем уровне привилегированности, равном 3.
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев. #AC для невыравненной ссылки к
памяти при текущем уровне привилегированности, равном 3.
-----------------------------------------------------------------
MOVSX - Пересылка с расширением знаком
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|0F BE /r  MOVSX r16,r/m8   3/3    Пересылка байта в слово      |
|                                  с расширением знаком         |
|0F BE /r  MOVSX r32,r/m8   3/3    Пересылка байта в двойное    |
|                                  слово с расширением знаком   |
|0F BF /r  MOVSX r32,r/m16  3/3    Пересылка слова в двойное    |
|                                  слово с расширением знаком   |
-----------------------------------------------------------------
Работа команды
--------------
DEST <- SignExtend(SRC);
Описание
--------
Команда MOVSX считывает содержимое исполнительного адреса или
регистра в байте или слове, расширяет это значение знаком в
соответствии с атрибутом размера операнда команды (16 или 32
бита) и записывает результат в регистр назначения.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0) в случае недопустимого исполнительного адреса операнда
памяти в сегментах CS, DS, ES, FS или GS; #SS(0) в случае
недопустимого адреса в сегменте SS; #PF(код сбоя) в случае
страничного сбоя; #AC для невыравненной ссылки к памяти при
текущем уровне привилегированности, равном 3.
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев. #AC для невыравненной ссылки к
памяти при текущем уровне привилегированности, равном 3.
-----------------------------------------------------------------
MOVZX - Пересылка с расширением нулем
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|0F B6 /r  MOVZX r16,r/m8   3/3    Пересылка байта в слово      |
|                                  с расширением нулем          |
|0F B6 /r  MOVZX r32,r/m8   3/3    Пересылка байта в двойное    |
|                                  слово с расширением нулем    |
|0F B7 /r  MOVZX r32,r/m16  3/3    Пересылка слова в двойное    |
|                                  слово с расширением нулем    |
-----------------------------------------------------------------
Работа команды
--------------
DEST <- ZeroExtend(SRC);
Описание
--------
Команда MOVZX считывает содержимое исполнительного адреса или
регистра в байте или слове, расширяет это значение нулем в
соответствии с атрибутом размера операнда команды (16 или 32
бита) и записывает результат в регистр назначения.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0) в случае недопустимого исполнительного адреса операнда
памяти в сегментах CS, DS, ES, FS или GS; #SS(0) в случае
недопустимого адреса в сегменте SS; #PF(код сбоя) в случае
страничного сбоя; #AC для невыравненной ссылки к памяти при
текущем уровне привилегированности, равном 3.
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев. #AC для невыравненной ссылки к
памяти при текущем уровне привилегированности, равном 3.
-----------------------------------------------------------------
MUL - Умножение без знака AL или AX
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
|                                                               |
|F6 /4   MUL AL,r/m8   13/18,13/18  Умножение без знака         |
|                                   (AX <- AL * байт r/m)       |
|F7 /4   MUL AX,r/m16  13/26,13/26  Умножение без знака         |
|                                   (DX:AX <- AX * слово r/m)   |
|F7 /4   MUL EAX,r/m32 13/42,13/42  Умножение без знака         |
|                                   (EDX:EAX <- EAX *           |
|                                   двойное слово r/m)          |
-----------------------------------------------------------------
Примечания: Процессор i486 использует алгоритм умножения типа
"early-out". Фактическое число тактовых циклов зависит от
позиции наиболее значащего бита в оптимизируемом множителе.
Оптимизация выполняется как для положительных, так и для
отрицательных значений. Вследствие данного алгоритма даются
минимальные и максимальные количества тактовых циклов. Для
вычисления фактического числа тактовых циклов используется
следующая формула:
Фактическое число тактовых циклов = если m <> 0 то
max(наименьшее целое число, большее (log |m|)) + 6 циклов.
                                        2
Фактическое число тактовых циклов = если m = 0 то 9 циклов.
(где m это множитель)
Работа команды
--------------
IF операция байтового размера
THEN AX <- AL * r/m8
ELSE (* Операция размером в слово или двойное слово *)
  IF OperandSize = 16
  THEN DX:AX <- AX * r/m16
  ELSE (* OperandSize = 32 *)
    EDX:EAX <- EAX * r/m32
  FI;
FI;
Описание
--------
Команда IMUL выполняет умножение без знака. Ее действие зависит
от размера операндов следующим образом:
- Операнд размером в байт умножается на значение AL; результат
  помещается в регистр AX. Если значение AH равно 0, то флаги CF
  и OF очищаются; в противном случае они установлены.
- Операнд размером в слово умножается на значение AX; результат
  помещается в пару регистров DX:AX. Регистр DX содержит при
  этом старшие 16 битов произведения. Если значение DX равно 0,
  то флаги CF и OF очищаются; в противном случае они
  установлены.
- Операнд размером в двойное слово умножается на значение EAX;
  результат помещается в пару регистров EDX:EAX. Регистр EDX
  содержит при этом старшие 32 бита произведения. Если значение
  EDX равно 0, то флаги CF и OF очищаются; в противном случае
  они установлены.
Изменяемые флаги
----------------
Если старшая половина результата равна 0, то флаги OF и CF
очищаются; в противном случае они установлены; флаги SF, ZF, AF,
PF и CF неопределены.
Исключения защищенного режима
----------------------------------
#GP(0) в случае недопустимого исполнительного адреса операнда
памяти в сегментах CS, DS, ES, FS или GS; #SS(0) в случае
недопустимого адреса в сегменте SS; #PF(код сбоя) в случае
страничного сбоя; #AC для невыравненной ссылки к памяти при
текущем уровне привилегированности, равном 3.
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев; #AC для невыравненной ссылки к
памяти при текущем уровне привилегированности, равном 3.
-----------------------------------------------------------------
NEG - Отрицание с дополнением до двух
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|F6 /3     NEG r/m8        1/3     Отрицание с дополнением до   |
|                                  двух байта r/m               |
|F7 /3     NEG r/m16       1/3     Отрицание с дополнением до   |
|                                  двух слова r/m               |
|F7 /3     NEG r/m32       1/3     Отрицание с дополнением до   |
|                                  двух двойного слова r/m      |
-----------------------------------------------------------------
Работа команды
--------------
IF r/m = 0 THEN CF <- 0 ELSE CF <- 1; FI;
r/m <- - r/m
Описание
--------
Команда NEG замещает значение регистра или операнда памяти
соответствующим дополнением до двух. Операнд вычитается из нуля,
а результат помещается обратно в операнд.
Флаг CF установлен, если операнд не равен нулю, когда флаг CF
очищается.
Изменяемые флаги
----------------
Флаг CF установлен, если операнд не равен нулю, когда флаг CF
очищается; флаги OF, SF, ZF и PF устанавливаются в соответствии
с результатом.
Исключения защищенного режима
----------------------------------
#GP(0), если назначением является сегмент, недоступный для
записи; #GP(0) в случае недопустимого исполнительного адреса
операнда памяти в сегментах CS, DS, ES, FS или GS; #SS(0) в
случае недопустимого адреса в сегменте SS; #PF(код сбоя) в
случае страничного сбоя; #AC для невыравненной ссылки к памяти
при текущем уровне привилегированности, равном 3.
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев. #AC для невыравненной ссылки к
памяти при текущем уровне привилегированности, равном 3.
-----------------------------------------------------------------
NOP - Нет операции
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|90        NOP             1       Нет операции                 |
-----------------------------------------------------------------
Описание
--------
Команда NOP не выполняет никакой операции. Команда NOP это одно-
байтовая команда, которая занимает место в памяти, но не влияет
на контекст машины, за исключением регистра (E)IP.
Команда NOP представляет собой мнемонический алиас для команды
XCHG (E)AX,(E)AX.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
     Отсутствуют
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
     Отсутствуют
-----------------------------------------------------------------
NOT - Отрицание с дополнением до одного (поразрядное дополнение)
-----------------------------------------------------------------
|Код       Команда        Число      Описание                   |
|операции                 тактовых                              |
|                         циклов                                |
|                                                               |
|F6 /2     NOT r/m8        1/3     Изменение на противоположное |
|                                  значения каждого бита в      |
|                                  байте r/m                    |
|F7 /2     NOT r/m16       1/3     Изменение на противоположное |
|                                  значения каждого бита в      |
|                                  слове r/m                    |
|F7 /2     NOT r/m32       1/3     Изменение на противоположное |
|                                  значения каждого бита в      |
|                                  двойном слове r/m            |
-----------------------------------------------------------------
Работа команды
--------------
r/m <- NOT r/m;
Описание
--------
Команда NOT инвертирует операнд: каждая 1 становится 0, и
наоборот.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0), если назначением является сегмент, недоступный для
записи; #GP(0) в случае недопустимого исполнительного адреса
операнда памяти в сегментах CS, DS, ES, FS или GS; #SS(0) в
случае недопустимого адреса в сегменте SS; #PF(код сбоя) в
случае страничного сбоя; #AC для невыравненной ссылки к памяти
при текущем уровне привилегированности, равном 3.
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев. #AC для невыравненной ссылки к
памяти при текущем уровне привилегированности, равном 3.
-----------------------------------------------------------------
OR - Логическое исключающее ИЛИ
----------------------------------------------------------------
|Код       Команда     Число      Описание                     |
|операции              тактовых                                |
|                      циклов                                  |
|                                                              |
|0C ib     OR AL,imm8     1   Операция логического ИЛИ   непос-|
|                             редственного байта и AL          |
|0D iw     OR AX,imm16    1   Операция логического ИЛИ   непос-|
|                             редственного слова и AX          |
|0D id     OR EAX,imm32   1   Операция логического ИЛИ   непос-|
|                             редственного двойного слова и EAX|
|80 /1 ib  OR r/m8,imm8   1/3 Операция логического ИЛИ   непос-|
|                             редственного байта и байта в r/m |
|81 /1 iw  OR r/m16,imm16 1/3 Операция логического ИЛИ   непос-|
|                             редственного слова и слова в r/m |
|81 /1 id  OR r/m32,imm32 1/3 Операция логического ИЛИ   непос-|
|                             редственного двойного слова и    |
|                             двойного слова в r/m             |
|83 /1 ib  OR r/m16,imm8  1/3 Операция логического ИЛИ   непос-|
|                             редственного расширенного знаком |
|                             байта и слова в r/m              |
|83 /1 ib  OR r/m32,imm8  1/3 Операция логического ИЛИ   непос-|
|                             редственного расширенного знаком |
|                             слова и двойного слова в r/m     |
|08 /r     OR r/m8,r8     1/3 Операция логического ИЛИ         |
|                             байтового регистра и байта в r/m |
|09 /r     OR r/m16,r16   1/3 Операция логического ИЛИ         |
|                             регистра-слова и слова в r/m     |
|09 /r     OR r/m32,r32   1/3 Операция логического ИЛИ         |
|                             регистра-двойного слова и        |
|                             двойного слова в r/m             |
|0A /r     OR r8,r/m8     1/2 Операция логического ИЛИ   байта |
|                             в r/m и байтового регистра       |
|OB /r     OR r16,r/m16   1/2 Операция логического ИЛИ   слова |
|                             в r/m и регистра-слова           |
|OB /r     OR r32,r/m32   1/2 Операция логического ИЛИ         |
|                             двойного слова в r/m и регистра- |
|                             двойного слова                   |
----------------------------------------------------------------
Работа команды
--------------
DEST <- DEST OR  SRC;
CF <- 0;
OF <- 0;
Описание
--------
Команда OR вычисляет исключающее ИЛИ для ее двух операндов и
помещает результат в первый операнд. Каждый бит результата равен
0, если оба соответствующих бита операнда равны 0; в противном
случае бит результата равен 1.
Изменяемые флаги
----------------
Флаги CF и OF очищаются ; флаги PF, SF и ZF устанавливаются в
соответствии с результатом; флаг AF неопределен.
Исключения защищенного режима
----------------------------------
#GP(0), если результат должен помещаться в сегмент, для которого
запрещена запись; #GP(0) в случае недопустимого исполнительного
адреса операнда памяти в сегментах CS, DS, ES, FS или GS; #SS(0)
в случае недопустимого адреса в сегменте SS; #PF(код сбоя) в
случае страничного сбоя; #AC для невыравненной ссылки к памяти
при текущем уровне привилегированности, равном 3.
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев; #AC для невыравненной ссылки к
памяти при текущем уровне привилегированности, равном 3.
-----------------------------------------------------------------
OUT - Вывод в порт
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
|                                                               |
|E6 ib   OUT imm8,AL  16,pm=11*/    Вывод байта AL в непосредст-|
|                     31**,vm=29    венно заданный номер порта  |
|E7 ib   OUT imm8,AX  16,pm=11 */   Вывод слова AX в непосредст-|
|                     31**,vm=29    венно заданный номер порта  |
|E7 ib  OUT imm8,EAX  16,pm=11*/    Вывод двойного слова EAX в  |
|                     31**,vm=29    непосредственно заданный    |
|                                   номер порта в               |
|EE      OUT DX,AL    16,pm=11*/    Вывод байта AL в порт,      |
|                     31**,vm=29    номер которого задан в DX   |
|EF      OUT DX,AX    16,pm=11*/    Вывод слова AX в порт,      |
|                     31**,vm=29    номер которого задан в DX   |
|EF     OUT DX,EAX    16,pm=11*/    Вывод двойного слова EAX в  |
|                     31**,vm=29    порт,номер которого задан DX|
-----------------------------------------------------------------
     Примечания: * если CPL <= IOPL
                ** если CPL > IOPL
Работа команды
--------------
IF (PE = 1) AND ((VM = 1) OR (CPL > IOPL))
THEN (* Виртуальный режим 8086 или защищенный  режим  при  CPL  >
        IOPL *)
  IF NOT I-O-Permission(SRC, width(SRC))
  THEN #GP(0);
  FI;
FI;
[DEST] <- SRC; (*используемое адресное пространство ввода/вывода*
Описание
--------
Команда IN пересылает байт или слово данных из заданного вторым
операндом регистра (AL, AX или EAX) в выходной порт, номер
которого задан первым операндом. Доступ к любому порту от 0 до
65535 выполняется путем помещения номера порта в регистр DX и
использования команды OUT с регистром DX в качестве первого
операнда. Если команда содержит идентификатор восьми-битового
порта, то значение расширяется нулем до 16 битов.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0), если текущий уровень привилегированности больше (т.е.
привилегированность меньше) уровня привилегированности
ввода/вывода (IOPL) или если любой из соответствующих битов
разрешения ввода/вывода в TSS равен 1.
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
Сбой #GP(0), если любой из соответствующих битов разрешения
ввода/вывода в TSS равен 1.
-----------------------------------------------------------------
OUTS/OUTSB/OUTSW/OUTSD  - Вывод строки в порт
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
|                                                               |
|6E     OUTS DX,r/m8  17,pm=10*/    Вывод байта [(E)SI] в порт, |
|                     32**,vm=30    заданный в DX               |
|6F     OUTS DX,r/m16 17,pm=10*/    Вывод слова [(E)SI] в порт, |
|                     32**,vm=30    заданный в DX               |
|6F     OUTS DX,r/m32 17,pm=10*/    Вывод двойного слова [(E)SI]|
|                     32**,vm=30    в порт, заданный в DX       |
|6E     OUTSB         17,pm=10*/  Вывод байта DS:[(E)SI] в порт,|
|                     32**,vm=30    заданный в DX               |
|6F     OUTSW         17,pm=10*/  Вывод слова DS:[(E)SI] в порт,|
|                     32**,vm=30    заданный в DX               |
|6F     OUTSD         17,pm=10*/  Вывод двойн. слова DS:[(E)SI] |
|                     32**,vm=30    в порт, заданный в DX       |
-----------------------------------------------------------------
     Примечания: * если CPL <= IOPL
                ** если CPL > IOPL
Работа команды
--------------
IF AddressSize = 16
THEN использование SI как индекса-источника;
ELSE (* AddressSize = 32 *)
     использование ESI как индекса-источника;
FI;
IF (PE = 1) AND ((VM = 1) OR (CPL > IOPL))
THEN (* Виртуальный режим 8086 или защищенный  режим  при  CPL  >
        IOPL *)
  IF NOT I-O-Permission(DEST, width(DEST))
  THEN #GP(0);
  FI;
FI;
IF команда байтового типа
THEN
  [DX] <-[индекс-источника];  (* Запись байта в адресное
      пространство ввода/вывода согласно DX *)
  IF DF = 0 THEN IncDec <- 1 ELSE IncDec <- -1; FI;
FI;
IF OperandSize = 16
THEN
  [DX] <- [индекс-источника];  (* Запись слова в адресное
      пространство ввода/вывода согласно DX *)
  IF DF = 0 THEN IncDec <- 2 ELSE IncDec <- -2; FI;
FI;
IF OperandSize = 32
THEN
  [DX] <- [индекс-источника] <- [DX];  (* Запись двойного слова
      в адресное пространство ввода/вывода согласно DX *)
  IF DF = 0 THEN IncDec <- 4 ELSE IncDec <- -4; FI;
FI;
индекс-источника <- индекс-источника + IncDec;
Описание
--------
Команда OUTS пересылает данные из байта, слова или двойного
слова памяти, заданного регистром индекса-источника в порт
вывода, адресуемый регистром DX. Если атрибут размера адреса для
данной команды равен 16 битам, то в качестве регистра
индекса-источника используется регистр SI; в противном случае,
когда атрибут размера адреса равен 32 битам, регистром
индекса-источника является ESI.
Команда OUTS не позволяет задавать номер порта непосредственным
значением. Порт должен адресоваться значением в регистре DX.
Перед выполнением команды OUTS в DX должно быть загружено
правильное значение.
Адрес источника данных определяется содержимым регистра индекса
источника. Перед выполнением команды OUTS в регистр индекса
источника должно быть загружено правильное значение индекса.
После выполнения пересылки регистр индекса источника
соответственным образом автоматически продвигается. Если флаг DF
равен 0 (была выполнена команда CLD), то происходит инкремент
региста; Если флаг DF равен 1 (была выполнена команда STD), то
происходит его декремент. Инкремент или декремент регистра равен
1 при выводе байта, 2 при выводе слова и 4 при выводе двойного
слова.
Команды OUTSB, OUTSW и OUTSD - это синонимы команды OUTS,
работающие с байтом, словом и двойным словом, соответственно.
Команде OUTS может предшествовать префикс REP для вывода блока,
равного CX байтов или слов. Эта операция описана для команды
REP.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
#GP(0), если текущий уровень привилегированности численно больше
уровня привилегированности ввода/вывода (IOPL) или если любой из
соответствующих битов разрешения ввода/вывода в TSS равен 1.
исполнительного адреса операнда памяти в сегментах CS, DS, ES,
FS или GS; #SS(0) в случае недопустимого адреса в сегменте SS; #
PF(код сбоя) в случае страничного сбоя; #AC для невыравненной
ссылки к памяти при текущем уровне привилегированности, равном
3.
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Сбой #GP(0), если любой из соответствующих битов разрешения
ввода/вывода в TSS равен 1. #PF (код сбоя) для страничных сбоев;
#AC для невыравненной ссылки к памяти при текущем уровне
привилегированности, равном 3.
-----------------------------------------------------------------


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