|
Часть 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.
-----------------------------------------------------------------
|