Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_rab_1.doc
Скачиваний:
24
Добавлен:
13.11.2019
Размер:
698.37 Кб
Скачать

2.3.2. Двоичная арифметика

Все команды этого раздела, кроме команд деления и умножения, изменяют флаги OF, SF, ZF, AF, CF, PF в соответствии с назначением каждого из них.

Команда

Назначение

Процессор

ADD приемник, источник

Сложение

8086

Команда выполняет арифметическое сложение приемника и источника, помещает сумму в приемник, не изменяя содержимое источника. Приемник может быть регистром или переменной, источник - числом, регистром или переменной, но нельзя использовать переменную одновременно и для источника, и для приемника. Команда ADD никак не различает числа со знаком и без знака, но, употребляя значения флагов CF (перенос при сложении чисел без знака), OF (перенос при сложении чисел со знаком) и SF (знак результата), разрешается применять ее и для тех, и для других.

Команда

Назначение

Процессор

ADC приемник, источник

Сложение с переносом

8086

Эта команда аналогична ADD, но при этом выполняет арифметическое сложение приемника, источника и флага CF. Пара команд ADD/ADC используется для сложения чисел повышенной точности. Сложим, например, два 64-битных целых числа. Пусть одно из них находится в паре регистров ЕрХ:ЕАХ (младшее двойное слово (биты 0-31) - в ЕАХ и старшее (биты 32-63) - в EDX), а другое - в паре регистров ЕВХ:ЕСХ:

Если при сложении младших двойных слов произошел разряда (флаг CF = 1), то он будет учтен следующей командой перенос из старшего ADC.

Команда

Назначение

Процессор

XADD приемник, источник

Обменять между собой и сложить

80486

Выполняет сложение, помещает содержимое приемника в источник, а сумму операндов - в приемник. Источник - всегда регистр, приемник может быть регистром и переменной.

Команда

Назначение

Процессор

SUB приемник, источник

Вычитание

8086

Вычитает источник из приемника и помещает разность в приёмник. Приёмник может быть регистром или переменной, источник – числом, регистром или переменной, но нельзя использовать переменную одновременно и для приемника. Точно так же, как и команда ADD, SUB не делает между числами со знаком и без знака, но флаги позволяют использовать ее и для тех, и для других.

Команда

Назначение

Процессор

SBB приемник, источник

Вычитание с займом

8086

Эта команда аналогична SUB, но она вычитает из приемника значение источника и дополнительно вычитает значение флага СЕ. Ее можно использовать для вычитания 64-битных чисел в EDX:EAX и ЕВХ:ЕСХ аналогично ADD/ADC.

Если при вычитании младших двойных слов произошел заем, то он будет учтен при вычитании старших слов.

Команда

Назначение

Процессор

IMUL источник

IMUL приемник, источник

IMUL приемник, источник1, источник2

Умножение чисел со знаком

8086

80386

80186

Эта команда имеет три формы, различающиеся числом операндов:

  1. IMUL источник: источник (регистр или переменная) умножается на AL, АХ или ЕАХ (в зависимости от размера операнда), и результат располагается в АХ, DX:AX или EDX:EAX соответственно.

  2. IMUL приемник, источник: источник (число, регистр или переменная) умножается на приемник (регистр), и результат заносится в приемник.

  3. IMUL приемник, источник1, источник2: источник 1 (регистр или переменная) умножается на источник 2 (число), и результат заносится в приемник (регистр).

Во всех трех вариантах считается, что результат может занимать в два раза больше места, чем размер источника. В первом случае приемник автоматически оказывается очень большим, но во втором и третьем случаях существует вероятность переполнения и потери старших битов результата. Флаги OF и CF будут равны единице, если это произошло, и нулю, если результат умножения поместился целиком в приемник (во втором и третьем случаях) или в младшую половину приемника (в первом случае).

Значения флагов SF, ZF, AF и PF после команды IMUL не определены.

Команда

Назначение

Процессор

MUL источник

Умножение чисел без знака

8086

Выполняет умножение содержимого источника (регистр или переменная) и регистра AL, АХ, ЕАХ (в зависимости от размера источника) и помещает результат в АХ, DX:AX, EDX.-EAX соответственно. Если старшая половина результата (АН, DX, EDX) содержит только нули (результат целиком поместился в младшую половину), флаги CF и OF устанавливаются в 0, иначе - в 1. Значение остальных флагов (SF, ZF, AF и PF) не определено.

Команда

Назначение

Процессор

IDIV источник

Целочисленное деление со знаком

8086

Выполняет целочисленное деление со знаком AL, АХ или ЕАХ (в зависимости от размера источника) на источник (регистр или переменная) и помещает результат в AL, АХ или ЕАХ, .а остаток - в АН, DX или EDX соответственно. Результат всегда округляется в сторону нуля, знак остатка совпадает со знаком делимого, абсолютное значение остатка меньше абсолютного значения делителя.

Флаги CF, OF, SF, ZF, AF и PF после этой команды не определены, а переполнение или деление на ноль вызывает исключение #DE (ошибка при делении) в защищенном режиме и прерывание О - в реальном.

Команда

Назначение

Процессор

DIV источник

Целочисленное деление без знака

8086

Выполняет целочисленное деление без знака AL, АХ или ЕАХ (в зависимости от размера источника) на источник (регистр или переменная) и помещает результат в AL, АХ или ЕАХ, а остаток - в АН, DX или EDX соответственно. Результат всегда округляется в сторону нуля, абсолютное значение остатка меньше абсолютного значения делителя. Флаги CF, OF, SF, ZF, AF и PF после этой команды не определены, а переполнение или деление на ноль вызывает исключение #DE (ошибка при делении) в защищенном режиме и прерывание 0-в реальном.

Команда

Назначение

Процессор

INC приемник

Инкремент

8086

Увеличивает приемник (регистр или переменная) на 1. Единственное отличие этой команды от ADD приемник, состоит в том, что флаг CF не затрагивается. Остальные арифметические флаги (OF, SF, ZF, AF, PF) устанавливаются в соответствии с результатом сложения.

Команда

Назначение

Процессор

DEC приемник

Декремент

8086

Уменьшает приемник (регистр или переменная) на 1. Единственное отличие этой команды от SUB приемник, 1 заключается в том, что флаг CF не затрагивается. Остальные арифметические флаги (OF, SF, ZF, AF, PF) устанавливаются в соответствии с результатом вычитания.

Команда

Назначение

Процессор

NEG приемник

Изменение знака

8086

Выполняет над числом, содержащимся в приемнике (регистр или переменная), операцию дополнения до двух. Эта операция эквивалентна обращению знака операнда, если рассматривать его как число со знаком. Если приемник равен нулю, флаг CF устанавливается в 0, иначе - в 1. Остальные флаги (OF, SF, ZF, AF, PF) назначаются в соответствии с результатом операции.

Команда

Назначение

Процессор

СМР приемник,источник

Сравнение

8086

Сравнивает приемник и источник и устанавливает флаги. Действие осуществляется путем вычитания источника (число, регистр или переменная) из приемника (регистр или переменная; приемник и источник не могут быть переменными одновременно), причем результат вычитания никуда не записывается.

Единственным следствием работы этой команды оказывается изменение флагов CF, OF, SF, ZF, AF и PF. Обычно команду СМР используют вместе с командами условного перехода (Jcc), условной пересылки данных (CMOVcc) или условной установки байтов (SETcc), которые позволяют применить результат сравнения, не обращая внимания на детальное значение каждого флага. Так, команды CMOVE, JE и SETE выполнят соответствующие действия, если значения операндов предшествующей команды СМР были равны.

Команда

Назначение

Процессор

CMPXCHG приемник, источник

Сравнить и обменять между собой

80486

Сравнивает значения, содержащиеся в AL, АХ, ЕАХ (в зависимости от размера операндов), с приемником (регистром). Если они равны, информация из источника копируется в приемник и флаг ZF устанавливается в 1, в противном случае содержимое приемника копируется в AL, АХ, ЕАХ и флаг ZF устанавливается в 0. Остальные флаги определяются по результату операции сравнения, как после СМР. Источник - всегда регистр, приемник может быть регистром и переменной.

Команда

Назначение

Процессор

CMPXCHG8B приемник

Сравнить и обменять 8 байт

Р5

Выполняет сравнение содержимого регистров EDX:EAX как 64-битного числа (младшее двойное слово - в ЕАХ, старшее - в EDX) с приемником (8-байтная переменная в памяти). Если они равны, содержимое регистров ЕСХ:ЕВХ как 64-битное число (младшее двойное слово в ЕВХ, старшее - в ЕСХ) помещается в приемник. В противном случае содержимое приемника копируется в EDX:EAX.

2.3.3. Логические операции

Команда

Назначение

Процессор

AND приемник, источник

Логическое И

8086

Команда выполняет побитовое «логическое И» над приемником (регистр или переменная) и источником (число, регистр или переменная; источник и приемник не могут быть переменными одновременно) и помещает результат в приемник. Любой бит результата равен 1, только если соответствующие биты обоих операндов были равны 1, и равен 0 в остальных случаях. Наиболее часто AND применяют для выборочного обнуления отдельных битов. Например, команда

обнулит старшие четыре бита регистра AL, сохранив неизменными четыре младших.

Флаги OF и CF обнуляются, SF, ZF и PF устанавливаются в соответствии с результатом, AF не определен.

Команда

Назначение

Процессор

OR приемник, источник

Логическое ИЛИ

8086

Выполняет побитовое «логическое ИЛИ» над приемником (регистр или переменная) и источником (число, регистр или переменная; источник и приемник не могут быть переменными одновременно) и помещает результат в приемник. Любой бит результата равен 0, только если соответствующие биты обоих операндов были равны 0, и равен 1 в остальных случаях. Команду OR чаще всего используют для выборочной установки отдельных битов. Например, команда

приведет к тому, что младшие четыре бита регистра AL будут установлены в 1.

При выполнении команды OR флаги OF и CF обнуляются, SF, ZF и PF устанавливаются в соответствии с результатом, AF не определен.

Команда

Назначение

Процессор

XOR приемник, источник

Логическое исключающее ИЛИ

8086

Выполняет побитовое «логическое исключающее ИЛИ» над приемником (регистр или переменная) и источником (число, регистр или переменная; источник и приемник не могут быть переменными одновременно) и помещает результат в приемник. Любой бит результата равен 1, если соответствующие биты операндов различны, и нулю - в противном случае. XOR используется для самых разных операций, например:

Оба примера могут выполняться быстрее, чем соответствующие очевидные команды

Команда

Назначение

Процессор

NOT приемник

Инверсия

8086

Каждый бит приемника (регистр или переменная), равный нулю, устанавливается в 1, и каждый бит, равный 1, сбрасывается в 0. Флаги не затрагиваются.

Команда

Назначение

Процессор

TEST приемник, источник

Логическое сравнение

8086

Вычисляет результат действия побитового «логического И» над приемником (регистр или переменная) и источником (число, регистр или переменная; источник и приемник не могут быть переменными одновременно) и устанавливает флаги SF, ZF и PF в соответствии с полученным показателем, не сохраняя результата (флаги OF и CF обнуляются, значение AF не определено). TEST, так же как и СМР, используется в основном в сочетании с командами условного перехода (Jcc), условной пересылки данных (CMOVcc) и условной установки байтов (SETcc).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]