logo

Воскресенье 20 Август 2017 (GMT+0300)

Система команд x86

Программирование - Архитектура и система команд микропроцессоров 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

CMP

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

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

OF

DF

IF

TF

SF

ZF

AF

PF

CF

*

     

*

*

*

*

*

 

Код

Команда

Описание

Проц.

Пример

3C ib

CMP AL,imm8

Сравнить imm8 и регистра AL

8086

cmp al,17

3D iw

CMP AX,imm16

Сравнить imm16 и регистра AX

8086

cmp ax,0AABh

3D id

CMP EAX,imm32

Сравнить imm32 и регистра EAX

Intel286

cmp eax,0AAC23h

80 /7 ib

CMP r/m8,imm8

Сравнить imm8 и r/m8

8086

cmp bl,5

81 /7 iw

CMP r/m16,imm16

Сравнить imm16 и r/m16

8086

cmp bx,0A4Fh

81 /7 id

CMP r/m32,imm32

Сравнить imm32 и r/m32

Intel286

cmp edx,0CAAAAh

83 /7 ib

CMP r/m16,imm8

Сравнить знакорасширенного  imm8 и r/m16

8086

cmp word ptr [di],7

83 /7 ib

CMP r/m32,imm8

Сравнить знакорасширенного  imm8 и r/m32

Intel286

cmp ecx,0Fh

38 /r

CMP r/m8,r8

Сравнить байтового регистра и r/m8

8086

cmp ch,al

39 /r

CMP r/m16,r16

Сравнить 16-битного регистра и r/m16

8086

cmp word ptr m32,dx

39 /r

CMP r/m32,r32

Сравнить 32-битного регистра и r/m32

Intel286

cmp edx,ebx

3A /r

CMP r8,r/m8

Сравнить r/m8 и байтового регистра

8086

cmp ch,sum

3B /r

CMP r16,r/m16

Сравнить r/m16 и 16-битного регистра

8086

cmp si,ax

3B /r

CMP r32,r/m32

Сравнить r/m32 и 32-битного регистра

Intel286

cmp edi,raznost

Описание:

Команда CMP (Compare Two Operands) относится к группе команд целочисленной (или двоичной) арифметики (Binary Arithmetic Instructions) и производит сравнение двух операндов, вычитая из первого операнда (LeftSRC) второй операнд (RightSRC) таким же образом, как это делает команда SUB. Первый операнд может быть переменной в регистре или в памяти (r8, r16, r32, r/m8, r/m16, r/m32). Второй операнд — непосредственным значением (imm8, imm16, imm32), переменной в регистре или в памяти. При этом оба операнда одновременно не могут быть переменными в памяти.

В отличие от команды SUB, результат вычитания командой CMP не сохраняется, но флаги в регистре EFLAGS устанавливаются в соответствии с этим результатом также, как это описано для команды SUB.

При сравнении непосредственного значения imm8 или imm16 с двухбайтным или четырехбайтным операндом непосредственная величина прежде всего знакорасширяется до размера первого операнда (LeftSRC), и только после этого выполняется сравнение (вычитание).

Команда CMP обычно используется вместе с командами условных переходов Jcc, командами SETcc и CMOVcc.

Операция:

temp = LeftSRC - SignExtend(RightSRC); (* при выполнении этого действия все флаги устанавливаются также, как и для команды SUB *)

(* CMP не сохраняет результат; цель команды - установление флагов *)

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

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

Intel386 … :
#PF(Код ошибки) при страничной ошибке.
#UD при использовании префикса LOCK.

Intel486 … :
#AC(0) при невыровненной ссылке в память, если активирован контроль выравнивания (CR0.AM = 1, EFLAGS.AC = 1, CPL = 3).

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

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

Intel386 … :
#UD при использовании префикса LOCK (по неясной причине в документации Intel данное исключение для режима реальной адресации не было указано).

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

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

Intel386 … :
#PF(Код ошибки) при страничной ошибке.
#UD при использовании префикса LOCK.

Intel486 … :
#AC(0) при невыровненной ссылке в память, если активирован контроль выравнивания (CR0.AM = 1, EFLAGS.AC = 1, CPL = 3).

Замечание:

К командам целочисленной арифметики относятся команды ADD, ADC, SUB, SBB, IMUL, MUL, IDIV, DIV, INC, DEC, NEGCMP.

В свою очередь, сами названные команды целочисленной арифметики делятся на следующие подгруппы:

  • команды сложения (ADDADCINC);
  • команды вычитания (SUB, SBB, DEC);
  • команды умножения (IMUL, MUL);
  • команды деления (IDIV, DIV).
  • команды сравнения и изменения знака (CMP, NEG).

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




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

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

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