Ассемблиада вики
Advertisement

Источник: Основные команды арифметики


Группа "Основная арифметика"

В группу "Основная арифметика" в данном справочнике включены следующие команды:

 Команда Выполняемая операция
  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 выполняют поразрядные логические операции для двух своих операндов. Для каждой битовой позиции результат определяется так:

AND
dstsrc = 
000
010
100
111
 
OR
dstsrc = 
000
011
101
111
 
XOR
dstsrc = 
000
011
101
110


Команды с одним операндом

Команда 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:

Нет воздействия на флажки, флажки не изменяются.

Advertisement