|
|
ОСНОВНЫЕ КОМАНДЫ АРИФМЕТИКИ
Группа "Основная арифметика"
В группу "Основная арифметика" в данном справочнике
включены следующие команды:
Команда | Выполняемая операция |
|
ADD |
Сложение |
OR |
Логическое включающее "ИЛИ" |
ADC |
Сложение с переносом |
SBB |
Вычитание с заемом |
AND |
Логическое "И" |
SUB |
Вычитание |
XOR |
Логическое исключающее "ИЛИ" |
CMP |
Сравнение двух операндов |
|
TEST |
Логическое сравнение |
|
NEG |
Получение дополнительного кода (изменение знака) |
NOT |
Инвертирование |
Команды ADD, OR, ADC, SBB,
AND, SUB, XOR, CMP - эти восемь команд
можно назвать самыми первыми в системе команд x86 ("первая восьмерка"),
достаточно взглянуть на ту таблицу команд, в которой команды
расположены в порядке кодов операций. Все эти команды имеют два операнда
и совершенно одинаковый формат (три разных формы),
как на языке ассемблера, так и в машинных кодах.
Команда TEST также имеет два операнда. Три ее формы почти
такие же, как у команд первой восьмерки и отличаются только в деталях.
Команды NEG и NOT имеют только один операнд,
их формат намного проще.
Примечание. Команды умножения и деления помещены в свою
отдельную группу:
Умножение и деление
Операнды, коды, форматы
Команда | Операнды |
Код | Формат |
|
ADD |
(r/m8), (reg8) |
00 |
------dw MRM |
ADD |
(r/m16), (reg16) (r/m32), (reg32) |
01 |
------dw MRM |
ADD |
(reg8), (r/m8) |
02 |
------dw MRM |
ADD |
(reg16), (r/m16) (reg32), (r/m32) |
03 |
------dw MRM |
ADD |
AL, (imm8) |
04 |
-------w data(1) |
ADD |
AX, (imm16) EAX, (imm32) |
05 |
-------w data(2/4) |
ADD |
(r/m8), (imm8) |
80 /000 |
------sw NNN data(1) |
ADD |
(r/m16), (imm16) (r/m32), (imm32) |
81 /000 |
------sw NNN data(2/4) |
ADD |
(r/m8), (imm8) |
82 /000 |
------sw NNN data(1) |
ADD |
(r/m16), (imm8) (r/m32), (imm8) |
83 /000 |
------sw NNN data(1) |
|
OR |
(r/m8), (reg8) |
08 |
------dw MRM |
OR |
(r/m16), (reg16) (r/m32), (reg32) |
09 |
------dw MRM |
OR |
(reg8), (r/m8) |
0A |
------dw MRM |
OR |
(reg16), (r/m16) (reg32), (r/m32) |
0B |
------dw MRM |
OR |
AL, (imm8) |
0C |
-------w data(1) |
OR |
AX, (imm16) EAX, (imm32) |
0D |
-------w data(2/4) |
OR |
(r/m8), (imm8) |
80 /001 |
------sw NNN data(1) |
OR |
(r/m16), (imm16) (r/m32), (imm32) |
81 /001 |
------sw NNN data(2/4) |
OR |
(r/m8), (imm8) |
82 /001 |
------sw NNN data(1) |
OR |
(r/m16), (imm8) (r/m32), (imm8) |
83 /001 |
------sw NNN data(1) |
|
ADC |
(r/m8), (reg8) |
10 |
------dw MRM |
ADC |
(r/m16), (reg16) (r/m32), (reg32) |
11 |
------dw MRM |
ADC |
(reg8), (r/m8) |
12 |
------dw MRM |
ADC |
(reg16), (r/m16) (reg32), (r/m32) |
13 |
------dw MRM |
ADC |
AL, (imm8) |
14 |
-------w data(1) |
ADC |
AX, (imm16) EAX, (imm32) |
15 |
-------w data(2/4) |
ADC |
(r/m8), (imm8) |
80 /010 |
------sw NNN data(1) |
ADC |
(r/m16), (imm16) (r/m32), (imm32) |
81 /010 |
------sw NNN data(2/4) |
ADC |
(r/m8), (imm8) |
82 /010 |
------sw NNN data(1) |
ADC |
(r/m16), (imm8) (r/m32), (imm8) |
83 /010 |
------sw NNN data(1) |
|
SBB |
(r/m8), (reg8) |
18 |
------dw MRM |
SBB |
(r/m16), (reg16) (r/m32), (reg32) |
19 |
------dw MRM |
SBB |
(reg8), (r/m8) |
1A |
------dw MRM |
SBB |
(reg16), (r/m16) (reg32), (r/m32) |
1B |
------dw MRM |
SBB |
AL, (imm8) |
1C |
-------w data(1) |
SBB |
AX, (imm16) EAX, (imm32) |
1D |
-------w data(2/4) |
SBB |
(r/m8), (imm8) |
80 /011 |
------sw NNN data(1) |
SBB |
(r/m16), (imm16) (r/m32), (imm32) |
81 /011 |
------sw NNN data(2/4) |
SBB |
(r/m8), (imm8) |
82 /011 |
------sw NNN data(1) |
SBB |
(r/m16), (imm8) (r/m32), (imm8) |
83 /011 |
------sw NNN data(1) |
|
AND |
(r/m8), (reg8) |
20 |
------dw MRM |
AND |
(r/m16), (reg16) (r/m32), (reg32) |
21 |
------dw MRM |
AND |
(reg8), (r/m8) |
22 |
------dw MRM |
AND |
(reg16), (r/m16) (reg32), (r/m32) |
23 |
------dw MRM |
AND |
AL, (imm8) |
24 |
-------w data(1) |
AND |
AX, (imm16) EAX, (imm32) |
25 |
-------w data(2/4) |
AND |
(r/m8), (imm8) |
80 /100 |
------sw NNN data(1) |
AND |
(r/m16), (imm16) (r/m32), (imm32) |
81 /100 |
------sw NNN data(2/4) |
AND |
(r/m8), (imm8) |
82 /100 |
------sw NNN data(1) |
AND |
(r/m16), (imm8) (r/m32), (imm8) |
83 /100 |
------sw NNN data(1) |
|
SUB |
(r/m8), (reg8) |
28 |
------dw MRM |
SUB |
(r/m16), (reg16) (r/m32), (reg32) |
29 |
------dw MRM |
SUB |
(reg8), (r/m8) |
2A |
------dw MRM |
SUB |
(reg16), (r/m16) (reg32), (r/m32) |
2B |
------dw MRM |
SUB |
AL, (imm8) |
2C |
-------w data(1) |
SUB |
AX, (imm16) EAX, (imm32) |
2D |
-------w data(2/4) |
SUB |
(r/m8), (imm8) |
80 /101 |
------sw NNN data(1) |
SUB |
(r/m16), (imm16) (r/m32), (imm32) |
81 /101 |
------sw NNN data(2/4) |
SUB |
(r/m8), (imm8) |
82 /101 |
------sw NNN data(1) |
SUB |
(r/m16), (imm8) (r/m32), (imm8) |
83 /101 |
------sw NNN data(1) |
|
XOR |
(r/m8), (reg8) |
30 |
------dw MRM |
XOR |
(r/m16), (reg16) (r/m32), (reg32) |
31 |
------dw MRM |
XOR |
(reg8), (r/m8) |
32 |
------dw MRM |
XOR |
(reg16), (r/m16) (reg32), (r/m32) |
33 |
------dw MRM |
XOR |
AL, (imm8) |
34 |
-------w data(1) |
XOR |
AX, (imm16) EAX, (imm32) |
35 |
-------w data(2/4) |
XOR |
(r/m8), (imm8) |
80 /110 |
------sw NNN data(1) |
XOR |
(r/m16), (imm16) (r/m32), (imm32) |
81 /110 |
------sw NNN data(2/4) |
XOR |
(r/m8), (imm8) |
82 /110 |
------sw NNN data(1) |
XOR |
(r/m16), (imm8) (r/m32), (imm8) |
83 /110 |
------sw NNN data(1) |
|
CMP |
(r/m8), (reg8) |
38 |
------dw MRM |
CMP |
(r/m16), (reg16) (r/m32), (reg32) |
39 |
------dw MRM |
CMP |
(reg8), (r/m8) |
3A |
------dw MRM |
CMP |
(reg16), (r/m16) (reg32), (r/m32) |
3B |
------dw MRM |
CMP |
AL, (imm8) |
3C |
-------w data(1) |
CMP |
AX, (imm16) EAX, (imm32) |
3D |
-------w data(2/4) |
CMP |
(r/m8), (imm8) |
80 /111 |
------sw NNN data(1) |
CMP |
(r/m16), (imm16) (r/m32), (imm32) |
81 /111 |
------sw NNN data(2/4) |
CMP |
(r/m8), (imm8) |
82 /111 |
------sw NNN data(1) |
CMP |
(r/m16), (imm8) (r/m32), (imm8) |
83 /111 |
------sw NNN data(1) |
|
TEST |
(reg8), (r/m8) |
84 |
-------w MRM |
TEST |
(reg16), (r/m16) (reg32), (r/m32) |
85 |
-------w MRM |
TEST |
AL, (imm8) |
A8 |
-------w data(1) |
TEST |
AX, (imm16) EAX, (imm32) |
A9 |
-------w data(2/4) |
TEST |
(r/m8), (imm8) |
F6 /000 |
-------w NNN data(1) |
TEST |
(r/m16), (imm16) (r/m32), (imm32) |
F7 /000 |
-------w NNN data(2/4) |
|
NEG |
(r/m8) |
F6 /011 |
-------w NNN |
NEG |
(r/m16) (r/m32) |
F7 /011 |
-------w NNN |
|
NOT |
(r/m8) |
F6 /010 |
-------w NNN |
NOT |
(r/m16) (r/m32) |
F7 /010 |
-------w NNN |
Порядок операндов
На языке ассемблера для команды с двумя операндами
принято записывать операнды в следующем порядке:
CMD dst, src
Здесь CMD - мнемоника команды, dst (destination) - приемник,
src (source) - источник.
Результат выполнения операции заносится в первый операнд dst.
В операциях вычитания из значения dst вычитается значение src.
Таким образом, операции сложения ADD и вычитания SUB
будут выглядить так:
dst = dst + src
dst = dst - src
Команды с участием флага переноса
Команда ADC выполняет сложение трех слагаемых:
первого (dst) операнда, второго (src) операнда и флага
переноса CF (значение 0 или 1).
Результат выполнения операции заносится в первый (dst) операнд.
По команде SBB из значения первого (dst) операнда
вычитается значение второго (src) операнда. Из полученного
результата вычитается значение флага переноса CF
(значение 0 или 1).
Результат выполнения операции заносится в первый (dst) операнд.
Условно это можно показать так:
dst = dst + src + CF
dst = dst - src - CF
Логические операции
Команды AND, OR, XOR выполняют поразрядные
логические операции для двух своих операндов. Для каждой битовой
позиции результат определяется так:
AND |
dst | src | = |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
| |
OR |
dst | src | = |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
| |
XOR |
dst | src | = |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
|
Команды с одним операндом
Команда NEG выполняет арифметическую операцию
вычитания операнда из нуля. Фактически это равносильно
изменению знака операнда.
Команда NOT выполняет порязрядную логическую операцию
инвертирования, каждый 0 заменяется на 1 и каждая 1 заменяется на 0.
Сравнение двух операндов
Для сравнения двух операндов (двух кодов или двух чисел)
могут использоваться команды CMP и TEST.
Команда CMP выполняет точно такую же операцию,
что и команда SUB.
Команда TEST выполняет точно такую же операцию,
что и команда AND.
Но в командах CMP и TEST результат никуда не записывается, так что
значения обоих операндов, dst и src, не изменяются. Результатом
сравнения будет только установка флажков.
Дополнительные сведения по командам сравнения есть на странице:
Команды сравнения кодов.
Установка флажков
Для команд сложения и вычитания ADD, ADC,
SUB, SBB, CMP, NEG:
Шесть флажков OF, SF, ZF, AF, PF, CF устанавливаются
соответственно результату операции.
Для команд логических операций AND, OR, XOR,
TEST:
Флажки SF, ZF, PF устанавливаются соответственно
результату операции.
Флажки OF, CF сбрасываются в нуль.
Флажок AF может измениться, но значение не предсказуемо.
Для команды NOT:
Нет воздействия на флажки, флажки не изменяются.
Основные страницы справочника
Справочник по командам процессоров x86
Все команды по алфавиту (кратко)
Все команды по алфавиту (подробно)
Первый байт кода операций
Второй байт кода операций
|
|
|