-----------------------------------------------------------------|Код Команда Число Описание ||операции тактовых || циклов || ||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 = 16THEN используйте 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.