- •Лабораторная работа №1 Компилятор fasm Арифметические операции.
- •Теоретическая часть
- •1. Представление данных в компьютерах
- •1.1. Двоичная система счисления
- •1.2. Биты, байты и слова
- •1.3. Шестнадцатеричная система счисления
- •1.4. Числа со знаком
- •1.5. Логические операции
- •1.6. Коды символов
- •1.7. Организация памяти
- •2. Процессоры Intel в реальном режиме
- •2.1. Регистры процессора
- •2.1.1. Регистры общего назначения
- •2.1.2. Сегментные регистры
- •2.1.3. Стек
- •2.1.4. Регистр флагов
- •2.2.4. Косвенная адресация
- •2.2.5. Адресация по базе со сдвигом
- •2.2.6. Косвенная адресация с масштабированием
- •2.2.7. Адресация по базе с индексированием
- •2.2.8. Адресация по базе с индексированием и масштабированием
- •2.3. Основные непривилегированные команды
- •2.3.2. Двоичная арифметика
- •3. Компилятор fasm
- •Практическая часть
- •Задания для самостоятельной работы
- •Индивидуальные варианты
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 |
Эта команда имеет три формы, различающиеся числом операндов:
IMUL источник: источник (регистр или переменная) умножается на AL, АХ или ЕАХ (в зависимости от размера операнда), и результат располагается в АХ, DX:AX или EDX:EAX соответственно.
IMUL приемник, источник: источник (число, регистр или переменная) умножается на приемник (регистр), и результат заносится в приемник.
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).
