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



 

Часть 29

CBW/CWDE  -  Преобразование байта в слово/Преобразование слова
             в двойное слово
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
|                                                               |
|98        CBW      3          AX <- расширение знаком AL       |
|98        CWDE     3          EAX<- расширение знаком AX       |
-----------------------------------------------------------------
Работа команды
--------------
IF OperandSize = 16 (* команда = CBW *)
THEN AX <- SignExtend(AL);
ELSE (OperandSize = 32, команда = CWDE *)
  EAX <- SignExtend(AX);
FI;
Описание
--------
Команда CBW преобразовывает имеющий знак байт в регистре AL в
имеющее знак слово в регистре AX путем расширения старшего бита
регистра AL (бита знака) на все биты регистра AH. Команда CWDE
преобразовывает имеющее знак слово в регистре AX в имеющее знак
двойное слово в регистре ЕAX путем расширения старшего бита
регистра AX (бита знака) на два старших байта регистра EAX.
Отметим, что команда CWDE отлична от команды CWD. Команда CWD
использует в качестве назначения вместо регистра EAX пару
регистров DX:AX.
Изменяемые флаги
----------------
     Отсутствуют
Исключения защищенного режима
----------------------------------
     Отсутствуют
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
     Отсутствуют
-----------------------------------------------------------------
CLC - Очистить флаг переноса
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
|                                                               |
| F8       CLC      2          Очистить флаг переноса           |
-----------------------------------------------------------------
Работа команды
--------------
CF <- 0;
Описание
--------
Команда CLC очищает флаг CF. На другие флаги или регистры она не
влияет.
Изменяемые флаги
----------------
Очищается флаг CF.
Исключения защищенного режима
----------------------------------
     Отсутствуют
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
     Отсутствуют
-----------------------------------------------------------------
CLD - Очистить флаг направления
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
|                                                               |
| FC       CLD      2          Очистить флаг направления: при   |
|                              выполнении строковых команд будет|
|                              происходить инкремент SI и DI    |
-----------------------------------------------------------------
Работа команды
--------------
DF <- 0;
Описание
--------
Команда CLD очищает флаг направления. На другие флаги или
регистры она не влияет. После выполнения команды CLD строковые
команды будут инкрементировать используемые ими индексные
регистры (SI и/или DI).
Изменяемые флаги
----------------
     Очищается флаг DF.
Исключения защищенного режима
----------------------------------
     Отсутствуют
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
     Отсутствуют
-----------------------------------------------------------------
CLI - Очистить флаг прерывания
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
|                                                               |
| FA       CLI      5          Очистить флаг прерывания;        |
|                              прерывания запрещены             |
-----------------------------------------------------------------
Работа команды
--------------
IF <- 0;
Описание
--------
Команда CLI очищает флаг прерывания IF, если текущий уровень
привилегированности как минимум равен IOPL. На другие флаги она
не влияет. Внешние прерывания не распознаются в конце команды
CLI и начиная с этого момента до установки команды IF.
Изменяемые флаги
----------------
     Очищается флаг IF.
Исключения защищенного режима
----------------------------------
#GP(0), если текущий уровень привилегированности имеет больший
номер (т.е. привилегированность меньше), чем уровень
привилегированности ввода/вывода в регистре флагов. Уровень
привилегированности ввода/вывода задает наименьший уровень
привилегированности, на котором допускается выполнение
ввода/вывода.
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
#GP(0) как для защищенного режима.
-----------------------------------------------------------------
CLTS - Очистить флаг переключения задачи в CR0
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
|                                                               |
| 0F 06    CLTS     7          Очистить флаг переключения задачи|
-----------------------------------------------------------------
Работа команды
--------------
Флаг TS в CR0 <- 0;
Описание
--------
Команда CLTS очищает флаг переключения задачи (TS) в регистре
CR0. Этот флаг устанавливается процессором всякий раз, когда
происходит переключение задачи. Флаг TS используется для
управления расширениями процессора следующим образом:
- Каждое выполнение команды ESC при установленном флаге TS
  вызывает исключение.
- Выполнение команды WAIT вызывает исключение ловушки при
  одновременно установленных флагах MP и TS.
Таким образом, если переключение задачи произошло после начала
команды ESC, может потребоваться сохранить контекст модуля для
операции с плавающей точкой, прежде чем может быть выдана новая
команда ESC. Обработчик сбоя сохраняет контекст и очищает флаг
TS.
Команда CLTS используется в операционном программном
обеспечении, а не в прикладных программах. Это привилегированная
команда, которая может быть выполнена только на уровне
привилегированности 0.
Изменяемые флаги
----------------
Очищается флаг TS (флаг в регистре CR0, а не во флаговом
регистре).
Исключения защищенного режима
----------------------------------
#GP(0), если команда CLTS выполняется с текущим уровнем
привилегированности, не равным 0.
Исключения режима реальных адресов
---------------------------------------
Отсутствуют (допустима в режиме реальных адресов для того, чтобы
позволить инициализацию для защищенного режима).
Исключения виртуального режима 8086
----------------------------------------
     Отсутствуют
-----------------------------------------------------------------
CMC - Дополнение флага переноса
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
|                                                               |
| F5       CMC      2          Дополнение флага переноса        |
-----------------------------------------------------------------
Работа команды
--------------
CF <- NOT CF;
Описание
--------
Команда CMC изменяет на противоположное значение флага CF. На
другие флаги влияния не оказывает.
Изменяемые флаги
----------------
Флаг CF содержит дополнение его исходного значения.
Исключения защищенного режима
----------------------------------
     Отсутствуют
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
     Отсутствуют
-----------------------------------------------------------------
CMP - Сравнение двух операндов
-----------------------------------------------------------------
|Код       Команда      Число    Описание                       |
|операции               тактовых                                |
|                       циклов                                  |
|                                                               |
|3C ib     CMP AL,imm8      1    Сравнение непосредственного    |
|                                байта с AL                     |
|3D iw     CMP AX,imm16     1    Сравнение непосредственного    |
|                                слова с AX                     |
|3D id     CMP EAX,imm32    1    Сравнение непосредственного    |
|                                двойного слова с EAX           |
|80 /7 ib  CMP r/m8,imm8    1/2  Сравнение непосредственного    |
|                                байта с байтом в r/m           |
|81 /7 iw  CMP r/m16,imm16  1/2  Сравнение непосредственного    |
|                                слова со словом в r/m          |
|81 /7 id  CMP r/m32,imm32  1/2  Сравнение непосредственного    |
|                                двойного слова с двойным словом|
|                                в r/m                          |
-----------------------------------------------------------------
Работа команды
--------------
LeftSRC - SignExtend(RightSRC);
(* CMP не выполняет запись результата;  ее назначение - установка
   флагов *)
Описание
--------
Команда CMP вычитает второй операнд из первого, но в отличие от
команды SUB, не записывает результат: она изменяет только
состояния флагов. Команда CMP обычно используется в сочетании с
условными переходами и командами SETcc. (Список имеющихся
проверок флагов, со знаком и без флагов, приводится в Приложении
D). Если операнд превышает один байт и сравнивается с
непосредственным байтом, то этот байт сначала расширяется
знаком.
Изменяемые флаги
----------------
Флаги OF, 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.
CMPS/CMPSB/CMPSW/CMPSD  -  Сравнение строковых операндов
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
|                                                               |
|A6      CMPS m8,m8     8      Сравнение байтов в ES:[(E)DI]    |
|                              (второй операнд) с [(E)SI]       |
|                              (первый операнд)                 |
|A7      CMPS m16,m16   8      Сравнение слов     ES:[(E)DI]    |
|                              (второй операнд) с [(E)SI]       |
|                              (первый операнд)                 |
|A7      CMPS m32,m32   8      Сравнение двойных слов ES:[(E)DI]|
|                              (второй операнд) с [(E)SI]       |
|                              (первый операнд)                 |
|A6      CMPSB          8      Сравнение байтов в ES:[(E)DI]    |
|                                               с DS:[SI]       |
|A7      CMPSW          8      Сравнение слов   в ES:[(E)DI]    |
|                                               с DS:[SI]       |
|A7      CMPSD          8      Сравнение двойных слов ES:[(E)DI]|
|                                               с DS:[SI]       |
-----------------------------------------------------------------
Работа команды
--------------
IF (команда = CMPSD) OR
   (команда имеет операнды типа DWORD)
THEN OperandSize <- 32;
ELSE OperandSize <- 16;
FI;
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 (* OperandSize = 32 *)
    [индекс-источника] - [индекс-назначения]; (* сравнение
                                                 двойных слов *)
    IF DF = 0 THEN IncDec <- 4 ELSE IncDec <- -4; FI;
  FI;
FI;
индекс-источника = индекс-источника + IncDec;
индекс-назначения = индекс-назначения + IncDec;
Описание
--------
Команда CMPS сравнивает байт, слово или двойное слово, на
которое указывает регистр индекса-источника, с байтом, словом
или двойным словом, на которое указывает регистр
индекса-назначения.
Если атрибут размера адреса этой команды равен 16 битов, то в
качестве регистров индекса источника и назначения используются
регистры SI и DI; в противном случае используются регистры ESI и
EDI. Перед выполнением команды CMPS в SI и DI (или ESI и EDI)
должны быть загружены правильные значения индексов.
Сравнение выполняется посредством вычитания операнда,
индексированного регистром индекса-назначения, из операнда,
индексированного регистром индекса-источника.
Отметим, что направление вычитания для команды CMPS это [SI] -
[DI] или [ESI] - [EDI]. Левый операнд (SI или ESI) является
источником, а правый операнд (DI или EDI) это назначение. Это
направление противоположно направлению, принятому по обычным
соглашениям Intel, где левый операнд является назначением, а
правый - источником.
Результат вычитания не записывается; он отражается только
изменением флагов. Тип операндов определяет, сравниваются ли
байты, слова или двойные слова. Для первого операнда (SI или
ESI) используется регистр DS, если отсутствует байт
переопределения сегмента. Второй операнд (DI или EDI) должен
позволять адресацию из регистра ES; переопределение сегмента
невозможно.
После того, как сравнение выполнено, происходит автоматическое
продвижение в регистрах индекса источника и индекса назначения.
Если флаг DF равен 0 (т.е. была использована команда CLD), то
происходит инкремент этих регистров; если же флаг DF равен 1
(была выполнена команда STD), то происходит декремент регистра.
При сравнении байтов выполняется инкремент или декремент на 1,
при сравнении слов на 2, а при сравнении двойных слов - на 4.
Команды CMPSB, CMPSW и CMPSD являются синонимами команды CMPS
lkz сравнения байтов, слов и двойных слов, соответственно.
Команде CMPS может предшествовать префикс REPE или REPNE для
блочного сравнения с использованием CX или ECX байтов, слов или
двойных слов. Более подробную информацию об этом см. в описании
команды REP.
Изменяемые флаги
----------------
Флаги OF, 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.
CMPXCHG - Сравнение и обмен
-----------------------------------------------------------------
|Код        Команда      Число           Описание               |
|операции                тактовых                               |
|                        циклов                                 |
|                                                               |
|0F A6/r CMPXCHG r/m8,r8 6/7, если срав- Сравнение AL с байтом  |
|                        нение успешно,  r/m. При равенстве ус- |
|                        и 6/10 иначе    танавливает ZF и загру-|
|                                        жает байт регистра в   |
|                                        байт r/m. Иначе очищает|
|                                        ZF и загружает байт r/m|
|                                        в AL                   |
|0F A7/r CMPXCHG         6/7, если срав- Сравнение AL со словом |
|        r/m16,r16       нение успешно,  r/m. При равенстве ус- |
|                        и 6/10 иначе    танавливает ZF и загру-|
|                                        жает регистр-слово в   |
|                                       слово r/m. Иначе очищает|
|                                       ZF и загружает слово r/m|
|                                        в AX                   |
|0F A7/r CMPXCHG         6/7, если срав- Сравнение AL с двойным |
|        r/m32,r32       нение успешно,  словом r/m. При равенс-|
|                        и 6/10 иначе    тве устан-т ZF и загру-|
|                                        жает регистр-двойное   |
|                                       слово r/m. Иначе очищает|
|                                       ZF и загружает двойное  |
|                                       слово r/m в EAX.        |
-----------------------------------------------------------------
Работа команды
--------------
IF аккумулятор = DEST
      ZF <- 1
      DEST <- SRC
ELSE
      ZF <- 0
      аккумулятор <- DEST
Описание
--------
Команда CMPXCHG сравнивает аккумулятор (регистр AL, AX или EAX)
с DEST. Если они равны, то SRC загружается в DEST. В противном
случае DEST загружается в аккумулятор.
Изменяемые флаги
----------------
Флаги CF, PF, AF, SF и OF изменяются таким образом, как если бы
была выполнена команда CMP с DEST и аккумулятором в качестве
операндов. Флаг ZF устанавливается, если операнд назначения и
аккумулятор равны; в противном случае он очищается.
Исключения защищенного режима
----------------------------------
#GP(0), если результат должен помещаться в сегмент, для которого
запрещена запись; #GP(0) в случае недопустимого исполнительного
адреса операнда памяти в сегментах CS, DS, ES, FS или GS; #SS(0)
в случае недопустимого адреса в сегменте SS; #PF(код сбоя) в
случае страничного сбоя; #AC для невыравненной ссылки к памяти
при текущем уровне привилегированности, равном 3.
Исключения режима реальных адресов
---------------------------------------
Прерывание 13, если какая-либо часть операнда лежит вне
пространства исполнительных адресов от 0 до 0FFFFH.
Исключения виртуального режима 8086
----------------------------------------
Те же исключения, что и для режима реальных адресов: #PF (код
сбоя) для страничных сбоев; #AC для невыравненной ссылки к
памяти при текущем уровне привилегированности, равном 3.
Примечания
----------
Эта команда может быть использоваться с префиксом LOCK. Для
упрощения интерфейса с шиной процессора операнд назначения
принимает цикл записи безотносительно к результату сравнения.
Если сравнение закончилось неудачно, то DEST записывается назад,
а в противном случае в операнд назначения записывается DEST.
(Процессор никогда не выдает цикла чтения с захватом без
соответствующей записи с захватом). Эта команда процессорами 386
не поддерживается. Использование команды CMPXCHG совместимым с
386 образом см. в разделе 3.11.
-----------------------------------------------------------------


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