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