Источник: Основные команды арифметики
Группа "Основная арифметика"
В группу "Основная арифметика" в данном справочнике
включены следующие команды:
Команда | Выполняемая операция |
ADD | Сложение |
OR | Логическое включающее "ИЛИ" |
ADC | Сложение с переносом |
SBB | Вычитание с заемом |
AND | Логическое "И" |
SUB | Вычитание |
XOR | Логическое исключающее "ИЛИ" |
CMP | Сравнение двух операндов |
TEST | Логическое сравнение |
NEG | Получение дополнительного кода (изменение знака) |
NOT | Инвертирование |
Команды ADD, OR, ADC, SBB, AND, SUB, XOR, CMP - эти восемь команд можно назвать самыми первыми в системе команд x86 ("первая восьмерка"), достаточно взглянуть на ту таблицу команд, в которой команды расположены в порядке кодов операций. Все эти команды имеют два операнда и совершенно одинаковый формат (три разных формы), как на языке ассемблера, так и в машинных кодах.
Команда TEST также имеет два операнда. Три ее формы почти такие же, как у команд первой восьмерки и отличаются только в деталях.
Команды NEG и NOT имеют только один операнд, их формат намного проще.
Примечание. Команды умножения и деления помещены в свою отдельную группу: <nobr> <a href="refe23.htm">Умножение и деление</a> </nobr>
Операнды, коды, форматы
Команда | Операнды | Код | Формат |
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 выполняют поразрядные
логические операции для двух своих операндов. Для каждой битовой
позиции результат определяется так:
|
|
|
Команды с одним операндом
Команда 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:
Нет воздействия на флажки, флажки не изменяются.