Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
CMPSD
Влияние команды на флаги и форматы команды:
* |
* |
* |
* |
* |
* |
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 |
Описание:
Команда 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 для более подробной информации по этой операции.
Операция:
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;
Особые ситуации защищенного режима:
#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) при невыровненной ссылке в память.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru