2.3.2. Двоичная арифметика
Все команды этого раздела, кроме команд деления и умножения, изменяют флаги OF, SF, ZF, АБ, CF, PF в соответствии с назначением каждого из них (см. раздел 2.1.4).
Команда |
Назначение |
Процессор |
ADD |
Сложение |
BGB6 |
Команда выполняет арифметическое сложение приемника и источника, помещает сумму в приемник, не изменяя содержимое источника. Приемник может быть регистром или переменной, источник - числом, регистром или переменной, но нельзя использовать переменную одновременно и для источника, и для приемника. Команда ADD никак не различает числа со знаком и без знака, но, употребляя значения флагов CF (перенос при сложении чисел без знака), OF (перенос при сложении чисел со знаком) и SF (знак результата), разрешается
применять ее и для тех, и для других.
Команда |
Назначение |
Процессор |
ADC приемник.источник |
Сложение с переносом |
BGB6 |
Эта команда аналогична ADD, но при этом выполняет арифметическое сложение приемника, источника и флага CF. Пара команд ADD/ADC используется для сложения чисел повышенной точности. Сложим, например, два 64-битных целых числа. Пусть одно из них находится в паре регистров ЕрХ:ЕАХ (младшее двойное слово (биты 0-31) - в ЕАХ и старшее (биты 32-63) - в ЕБХ), а другое - в паре регистров ЕВХ:ЕСХ: і
add еах.есх adc edx.ebx Если при сложении младших двойных слов произо! разряда (флаг CF = 1), то он будет учтен следующей ко |
перенос из старшего мандой ADC. |
Команда Назначение |
Процессор |
XADD приемник,источник Обменять между собой и |
сложить 80486 |
Выполняет сложение, помещает содержимое приемк операндов - в приемник. Источник - всегда регистр, при ром и переменной. |
ика в источник, а сумму ^мник может быть регист- |
Команда Назначение |
Процессор |
SUB приемник.источник Вычитание |
8086 |
Вычитает источник из приемника и помещает разж ник может быть регистром или переменной, источник переменной, но нельзя использовать переменную одновр и для приемника. Точно так же, как и команда ADD, ; между числами со знаком и без знака, но флаги позволя тех, и для других. |
|'Сть в приемник. Прием- числом, регистром или еменно и для источника, SUB не делает различий использовать ее и для |
Команда Назначение |
Процессор |
SBB приемник.источник Вычитание с займом |
8086 |
Эта команда аналогична SUB, но она вычитает из пр ника и дополнительно вычитает значение флага СЕ Ее вычитания 64-битных чисел в EDX:EAX и ЕВХ:ЕСХ ai sub еах.есх sbb edx.ebx Если при вычитании младших двойных слов произо тен при вычитании старших слов. Команда Назначение IMUL источник Умножение чисел со знак IMUL приемник.источник IMUL приемник,источник! ,источник2 |
иемника значение источ- можно использовать для 1алогичноАОО/АОС: заем, то он будет уч- Процессор ом 8086 80386 80186 |
Эта команда имеет три формы, различающиеся числом операндов:
1. ШиЬ источник: источник (регистр или переменная) умножается на ЛЬ, АХ или ЕАХ (в зависимости от размера операнда), и результат располагается в АХ, ЭХ:ЛХ или БЭХ:БЛХ соответственно.
2. ШШ. приемник,источник: источник (число, регистр или переменная) умножается на приемник (регистр), и результат заносится в приемник.
3. ШШ. приемник,источник1,источник2: источник 1 (регистр или переменная) умножается на источник 2 (число), и результат заносится в приемник (регистр).
Во всех трех вариантах считается, что результат может занимать в два раза больше места, чем размер источника. В первом случае приемник автоматически оказывается очень большим, но во втором и третьем случаях существует вероятность переполнения и потери старших битов результата. Флаги ОБ и СБ будут равны единице, если это произошло, и нулю, если результат умножения поместился целиком в приемник (во втором и третьем случаях) или в младшую половину приемника (в первом случае).
Значения флагов гБ, ЛБ и РБ после команды 1МиЬ не определены.
Команда |
Назначение |
Процессор |
М111_ источник |
Умножение чисел без знака ' |
8086 |
Выполняет умножение содержимого источника (регистр или переменная) и регистра ЛЬ, АХ, ЕАХ (в зависимости от размера источника) и помещает результат в АХ, ОХ:АХ, ЕБХ:ЕАХ соответственно. Если старшая половина результата (АН, ЭХ, БЭХ) содержит только нули (результат целиком поместился в младшую половину), флаги СБ и ОБ устанавливаются в 0, иначе - в 1. Значение остальных флагов (ББ, гБ, ЛБ и РБ) не определено.
Команда |
Назначение |
Процессор |
ЮМ источник |
Целочисленное деление со знаком |
8086 |
Выполняет целочисленное деление со знаком АБ, АХ или ЕАХ (в зависимости от размера источника) на источник (регистр или переменная) и помещает результат в АБ, АХ или ЕАХ,,а остаток - в АН, ЭХ или ЕБХ соответственно. Результат всегда округляется в сторону нуля, знак остатка совпадает со знаком делимого, абсолютное значение остатка меньше абсолютного значения делителя. Флаги СЕ, ОЕ, SF, гЕ, АF и PF после этой команды не определены, а переполнение или деление на ноль вызывает исключение #DE (ошибка при делении) в защищенном режиме и прерывание О-в реальном.
Команда |
Назначение |
Процессор |
□IV источник |
Целочисленное деление без знака |
8086 |
Выполняет целочисленное деление без знака АБ, АХ или ЕАХ (в зависимости от размера источника) на источник (регистр или переменная) и помещает результат в АБ, АХ или ЕАХ, а остаток - в АН, ЭХ или ЕЭХ соответственно. Результат всегда округляется в сторону нуля, абсолютное значение остатка меньше абсолютного значения делителя. Флаги CF, ОЕ SF, ZF, AF и PF после этой команды не определены, а переполнение или деление на ноль вызывает исключение #DE (ошибка при делении) в защищенном режиме и прерывание 0 - в реальном.
Команда |
Назначение |
Процессор |
INC приемник |
Инкремент |
8086 |
Увеличивает приемник (регистр или переменная) на 1. Единственное отличие этой команды от ADD приемникД состоит в том, что флаг CF не затрагивается. Остальные арифметические флаги (О^ SF, ZF, AF, PF) устанавливаются в соответствии с результатом сложения.
Команда |
Назначение |
Процессор |
DEC приемник |
Декремент |
8086 |
Уменьшает приемник (регистр или переменная) на 1. Единственное отличие этой команды от БИВ приемникД заключается в том, что флаг СБ не затрагивается. Остальные арифметические флаги (ОЕ БЕ XV, АБ, РБ) устанавливаются в со-
ответствии с результатом вычитания.
Команда |
Назначение |
Процессор |
ЫЕО приемник |
Изменение знака |
8086 |
Выполняет над числом, содержащимся в приемнике (регистр или переменная), операцию дополнения до двух. Эта операция эквивалентна обращению знака операнда, если рассматривать его как число со знаком. Если приемник равен нулю, флаг СБ устанавливается в 0, иначе - в 1. Остальные флаги (ОБ, ББ, 7Б, АБ, РБ) назначаются в соответствии с результатом операции.
Красивый пример использования команды NEG - получение абсолютного П^А1 значения числа, применяя всего две команды - изменение знака и переход на первую команду еще раз, если знак отрицательный:
1аЬеЮ: neg eax
js labelO
Команда |
Назначение |
Процессор |
СМР приемник,источник |
Сравнение |
8086 |
Сравнивает приемник и источник и устанавливает флаги. Действие осуществляется путем вычитания источника (число, регистр или переменная) из приемника (регистр или переменная; приемник и источник не могут быть переменными одновременно), причем результат вычитания никуда не записывается.
Единственным следствием работы этой команды оказывается изменение флагов
СЕ, ОБ, БЕ Ъ¥, А¥ и РЕ Обычно команду СМР используют вместе с командами условного перехода Осе), условной пересылки данных (СМОУсс) или условной установки байтов (SETcc), которые позволяют применить результат сравнения, не обращая внимания на детальное значение каждого флага. Так, команды CMOVE, JE и SETE выполнят соответствующие действия, если значения операндов предшествующей команды СМР были равны.
Несмотря на то что условные команды почти всегда вызываются сразу после СМР, не надо забывать, что их можно использовать после любой ко-Ч-/ манды, модифицирующей флаги, например: проверить равенство АХ нулю более короткой командой
test ах,ах а равенство единице - однобайтной командой dec ax
Команда |
Назначение |
Процессор |
CMPXCHG приемник, источник |
Сравнить и обменять между собой |
BG4B6 |
Сравнивает значения, содержащиеся в АЬ, АХ, ЕАХ (в зависимости от размера операндов), с приемником (регистром). Если они равны, информация из источника копируется в приемник и флаг 2Б устанавливается в 1, в противном случае содержимое приемника копируется в АЬ, АХ, ЕАХ и флаг 2Б устанавливается в 0. Остальные флаги определяются по результату операции сравнения, как после СМР. Источник - всегда регистр, приемник может быть регистром и переменной.
Команда |
Назначение |
Процессор |
приемник |
Сравнить и обменять B байт |
Р5 |
Выполняет сравнение содержимого регистров ЕБХ:ЕАХ как 64-битного числа (младшее двойное слово - в ЕАХ, старшее - в ЕБХ) с приемником (8-байтная переменная в памяти). Если они равны, содержимое регистров ЕСХ:ЕВХ как
64-битное число (младшее двойное слово в ЕВХ, старшее - в ЕСХ) помещается
в приемник. В противном случае содержимое приемника копируется в ЕБХ:ЕАХ.