ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
Часть 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. ----------------------------------------------------------------- |