logo

Система команд x86
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

CMPS

Сравнить строковые операнды

Влияние команды на флаги и форматы команды:

OF

DF

IF

TF

SF

ZF

AF

PF

CF

*

*

*

*

*

*

 

Код

Команда

Описание

Проц.

Пример

A6

CMPS m8,m8

Сравнить байт по адресу DS:(E)SI с байтом по адресу ES:(E)DI

8086

cmpsb

A7

CMPS m16,m16

Сравнить слово по адресу DS:(E)SI со словом по адресу ES:(E)DI

8086

cmpsw

A7

CMPS m32,m32

Сравнить двойное слово по адресу DS:(E)SI с двойным словом по адресу ES:(E)DI

Intel386

cmpsd

A6

CMPSB

Сравнить байт по адресу DS:(E)SI с байтом по адресу ES:(E)DI

8086

cmpsb

A7

CMPSW

Сравнить слово по адресу DS:(E)SI со словом по адресу ES:(E)DI

8086

cmpsw

A7

CMPSD

Сравнить двойное слово по адресу DS:(E)SI с двойным словом по адресу ES:(E)DI

Intel386

cmpsd

Операция:

IF (Команда типа CMPSD) OR (Команда с двойным словом в качестве операнда)

   THEN OperandSize = 32;

   ELSE OperandSize = 16;

FI;

IF AddressSize = 16

   THEN (Использовать SI для source-index и DI для destination-index);

   ELSE (* AddressSize = 32 *)

      Использовать ESI для source-index и EDI для destination-index;

FI;

IF (Команда с байтом в качестве операнда)

   THEN

      Установить ZF по результатам операции [destination-index] - [source-index];

      (* Сравнение байтов *)

      IF DF = 0 THEN IncDec = 1; ELSE IncDec = -1; FI;

   ELSE

      IF OperandSize = 16

      THEN

         Установить ZF по результатам операции [destination-index] - [source-index];

         (* Сравнение слов *)

         IF DF = 0 THEN IncDec = 2 ELSE IncDec = -2; FI;

      ELSE (* OperandSize = 32 *)

         Установить ZF по результатам операции [destination-index] - [source-index];

         (* Сравнение двойных слов *)

         IF DF = 0 THEN IncDec = 4 ELSE IncDec = -4; FI;

      FI;

FI;

source-index = source-index + IncDec;

destination-index = destination-index + IncDec;

Описание:

Команда CMPS сравнивает байт, слово или двойное слово, указанное индексным регистром-источником, с байтом, словом или двойным словом, указанным индексным регистром-назначением. Если атрибут размера адреса этой команды равен 16 битам, то в качестве индексных регистров источника и назначения будут использованы SI и DI, если же используется 32-битный атрибут размера адреса, то соответствующие регистры — ESI и EDI. Перед выполнением команды CMPS загрузите в регистры (E)SI и (E)DI правильные индексные значения.

Сравнение выполняется путем вычитания операнда, указанного индексным регистром-назначением из операнда, указанного индексным регистром-источником.

Заметьте, что направление вычитания для команды 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 для сравнения байтов, слов, или двойных слов, соответственно.

Команде CMPS может предшествовать префикс REPE или REPNE для сравнения блока из (E)CX байт, слов или двойных слов. Обратитесь к описанию REP для более подробной информации по этой операции.

Особые ситуации защищенного режима:


#GP(0), если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки), страничная ошибка.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.

Особые ситуации режима реальной адресации:


#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.

Особые ситуации режима V86:


Такие же, как и в режиме реальной адресации.
#PF(Код ошибки), страничная ошибка.
#AC(0) при невыровненной ссылке в память.

Входит в группу команд: Базовая система команд CPU



Все права защищены © 1997-2011 Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Яндекс.Метрика               Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники