- •1. Внутренние регистры
- •1.1. Регистры данных
- •1.2. Регистры сегментов
- •1.3. Регистры указателей и индексов
- •1.4. Регистр командного указателя
- •1.5. Флаговый регистр
- •2. Структура и процесс разработки программы на языке ассемблера
- •2.1. Команды
- •2.2. Псевдооператоры
- •2.2.1. Псевдооператор segment
- •2.2.2. Псевдооператор proc
- •2.2.3. Псевдооператор assume
- •2.2.4. Псевдооператор end
- •2.2.5. Псевдооператоры определения данных
- •2.3. Инициализация программы
- •3. Команды пересылки данных
- •3.1. Команда mov
- •3.2. Команды push и рор
- •4. Режимы адресации
- •4.1. Регистровая и непосредственная адресация
- •4.2. Исполнительный адрес
- •4.3. Прямая адресация
- •4.4. Косвенная регистровая адресация
- •4.5. Адресация по базе
- •4.6. Прямая адресация с индексированием
- •4.7. Адресация по базе с индексированием
- •5. Команды передачи управления
- •5.1. Команды call и ret
- •5.2. Команда безусловного перехода jmp
- •5.3. Команды условной передачи управления
- •5.4. Команды управления циклами
- •6. Команды обработки строк
- •6.1. Команды пересылки строк movs, movsb, movsw
- •6.2. Префиксы повторения
- •6.3. Команды сравнения строк. Команда cmps.
- •6.4. Команды сканирования строк
- •6.5. Команды загрузки и сохранения строки
- •7. Взаимодействие языков Си и Ассемблера
- •7.1. Внутренняя структура программы на языке Си для ibm pc
- •7.2. Использование функций на языке Ассемблера
- •7.2.1. Основы взаимодействия языков Си и Ассемблера
- •7.2.2. Передача управления в подпрограмму и обратно
- •7.2.3. Использование глобальных данных
- •7.2.4. Использование аргументов функции
- •7.2.5. Возвращение значения через имя подпрограммы
- •7.2.6. Использование аргументов
- •7.3. Вызов функций на языке Си из программ на языке Ассемблера
- •7.4. Использование локальных данных
- •8. Арифметические команды
- •8.1. Форматы хранения десятичных чисел
- •8.2. Команды сложения
- •8.3. Коррекция результата сложения для bcd-форматов
- •8.4. Команда приращения значения приемника на единицу
- •8.5. Команды вычитания
- •8.6. Коррекция результата вычитания для bcd-форматов
- •8.7. Команда уменьшения содержимого приемника на единицу
- •8.8. Команда обращения знака
- •8.9. Команды умножения
- •8.10. Коррекция результатов умножения
- •8.11. Команды деления
- •8.12. Коррекция результатов деления
- •8.13. Команды расширения знака
- •9. Команды манипулирования битами
- •9.1. Логические команды and, or и xor
- •9.2. Команда логического отрицания nот
- •9.3. Команда проверки test
- •9.4. Команды сдвига и циклического сдвига
- •9.4.1. Команды сдвига
- •9.4.2. Команды циклического сдвига
- •10. Команды работы с флагами
- •10.1. Команды управления флагами
- •10.2. Команды пересылки флагов
- •11. Псевдооператоры определения идентификаторов и операции
- •11.1. Псевдооператоры определения идентификаторов
- •11.2. Операции
- •11.2.1. Арифметические операции
- •11.2.2. Логические операции
- •11.2.3. Операции отношения
- •11.2.4. Операции, возвращающие значения
- •11.2.5. Операции присваивания атрибутов
- •12. Условные псевдооператоры
- •13. Макроопределения
- •13.1. Сравнение макроопределений и процедур
- •13.2. Состав макроопределений
- •13.3. Псевдооператоры макроассемблера
- •13.3.1. Псевдооператор local
- •13.3.2. Псевдооператоры повторения
- •13.3.3. Условные псевдооператоры
- •13.3.4. Псевдооператор eхiтм
- •13.4. Операции в макроопределениях
- •13.5. Задание макроопределений в исходных программах
- •13.5.1. Использование библиотеки макроопределений
- •13.5.2. Указания для задания макроопределений
- •13.5.3. Считывание библиотеки макроопределений в программу
- •13.5.4. Удаление макроопределений
8. Арифметические команды
Микропроцессор 8088 может выполнять арифметические команды над двоичными числами со знаком или без знака, а также над десятичными числами без знака. Имеются команды для выполнения четырех стандартных действий арифметики – сложения, вычитания, умножения и деления. Но, прежде чем приступить к описанию самих команд, рассмотрим форматы хранение десятичных чисел.
8.1. Форматы хранения десятичных чисел
Микропроцессор 8088 хранит десятичные числа в виде последовательностей байтов без знака в упакованном или неупакованном формате.
Упакованные десятичные числа. Каждый байт числа содержит две цифры в двоично-десятичном коде – BCD. При этом код старшей цифры числа занимает четыре старших бита. Следовательно, один упакованный десятичный байт может содержать значения от 00 до 99.
Неупакованные десятичные числа. Каждый байт числа содержит только один двоично-десятичный код цифры в четырех младших битах. Следовательно, один неупакованный десятичный байт может содержать лишь значение от 0 до 9.
Микропроцессор при арифметических операциях трактует все операнды только как двоичные числа.
Это хорошо в том случае, когда операнды действительно являются двоичными числами. Если же они являются десятичными, то результаты будут ошибочными. Для компенсации таких ошибок имеется группа команд коррекции, которые обеспечивают получение правильного результата после выполнения операций над десятичными числами.
8.2. Команды сложения
Команды ADD (сложить) и ADC (сложить с переносом) могут складывать 8- и 16-битовые операнды.
Команда ADD складывает содержимое операнда-источника и операнда-приемника и помещает результат в операнд-приемник. В символической нотации ее действия можно описать как
приемник = приемник + источник
Команда ADC делает то же, что и команда ADD, но при сложении использует также флаг переноса CF, что можно записать следующим образом:
приемник = приемник + источник + перенос
Перенос при сложении двоичных чисел аналогичен переносу при сложении десятичных чисел в столбик. Если сумма не помещается в операнде-приемнике, то генерируется перенос.
Пример. 8-битовый регистр может содержать значения без знака в диапазоне от 0 до 255. Если мы выполним двоичное сложение чисел 250 и 10, то получим
1111 1010 (двоичное представление числа 250)
+ 0000 1010 (двоичное представление числа 10)
1 0000 0100 (ответ: десятичное значение 260)
Как видим, результат занимает 9 двоичных битов. Если при выполнении этой операции мы использовали 8-битовые регистры, то младшие 8 битов будут занесены в регистр-приемник, а девятый бит – во флаг переноса CF.
В результате команда ADD может складывать значения, представляемые байтами или словами, а также младшие части значений повышенной точности. Команда ADC используется для сложения старших частей значений повышенной точности.
Примеры. Команда
ADD АХ, СХ
складывает 16-битовые значения регистров АХ и СХ и возвращает результат в регистр АХ.
Если операнды имеют длину более 16 битов, то можно воспользоваться следующим приемом. Пусть складываются 32-битовое число, находящееся в регистрах СХ и DX, с 32-битовым числом, находящимся в регистрах АХ и ВХ.
ADD АX, CX ;Сначала сложить младшие 16 битов, а затем
ADC BX, DX ; старшие 16 битов
Использованная здесь команда ADC добавляет к (DX)+(BX) любой перенос от сложения (СХ)+(АХ).
Можно добавлять находящийся в памяти операнд к регистру и наоборот или добавлять непосредственный операнд к регистру или операнду, находящемуся в памяти. Однако нельзя добавить значение одной ячейки памяти к другой или использовать в качестве приемника непосредственное значение.
Команды ADD и ADC могут воздействовать на шесть флагов:
Флаг переноса CF равен 1, если результат сложения не помещается в операнде-приемнике; в противном случае он равен 0.
Флаг четности PF равен 1, если результат имеет четное число битов со значением 1; в противном случае он равен 0.
Вспомогательный флаг переноса AF равен 1, если результат сложения десятичных чисел требует коррекции; в противном случае он равен 0.
Флаг нуля ZF равен 1, если результат равен 0; в противном случае он равен 0.
Флаг знака SF равен 1, если результат отрицателен (старший бит равен 1); в противном случае он равен 0.
Флаг переполнения OF равен 1, если сложение двух чисел одного знака (оба положительные или оба отрицательные) приводит к результату, который превышает диапазон допустимых значений приемника в обратном коде, а сам приемник при этом меняет знак. В противном случае флаг OF равен 0.
