Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка по МП[1].doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
513.02 Кб
Скачать
    1. Приемы программирования типовых арифметических задач

5.3.1.Многобайтные сложение и вычитание

В таких задачах используются команды сложения и вычитания с переносом и заемом чисел произвольной длины без знака.

Рассмотрим сложение двух трехбайтных чисел:

32AF8A

+

84BA90

B76A1A

Это сложение можно выполнить путем сложения двух младших байтов слагаемых, затем результатирующий перенос прибавляют к двум старшим байтам и т.д.:

Приведенная далее программа NADD выполняет многобайтное сложение при следующих условиях:

- в регистре Е находится длина каждого слагаемого (единица длины - байт), в данном примере длина равна 3;

- слагаемые хранятся в памяти, начиная с младших байт по адресам FIRST1 и FIRST2 соответственно;

- результат будет накапливаться от байта младшего разряда до байта старшего разряда с началом в ячейке памяти FIRST1, заменяя первоначальное содержимое этих ячеек.

Память до сложения Память после сложения

FIRST1 FIRST1

FIRST2 FIRST2

MADD : LXI B,FIRST1 ; адрес 1-го слагаемого

LXI H,FIRST2 ; адрес 2-го слагаемого

XPA A ; очистка бита переноса

LOOP : LDAX B ; байт 1-го слагаемого в (А)

ADC N ; сложение с байтом 2-го слагаемого

STAX B ; хранение результата по адресу слагаемого

INX B ; адрес

INX H ; адрес

DCP E ; если счетчик ≠0, то

JNZ LOOP ; переход к сложению старших байт

PET ; иначе конец.

Поскольку ни одна из команд в программном цикле, за исключением ADC, не влияет на бит переноса, то сложение с переносом будет продолжаться правильно.

5.3.2. Десятичное сложение

Любую четырехбитовую величину данных можно рассматривать как десятичную цифру от 0 до 9, если не содержаться комбинации, соответствующие шестнадцатиричным цифрам от А до F. Десятичное сложение выполняется при допущении, что каждый байт содержит две четырехбитовые десятичные цифры.

Байты суммируются в аккумуляторе стандартным способом, а команда DAA (десятичная коррекция А) применяется затем для преобразования 8-битового результата в правильное представление двух десятичных цифр. Установка битов переноса и вспомогательного переноса влияет на операцию DAA, что делает возможность складывать многоразрядные числа.

Рассмотрим подробнее процесс выполнения команды DAA. Эта команда преобразует в аккумуляторе 8-битное двоичное число в две четырехбитные двоично-кодированные цифры. Это происходит с учетом следующих правил:

  1. Если младшие 4 бита содержимого аккумулятора представляют число > 9 или бит вспомогательного переноса установлен, то содержимое аккумулятора увеличивается на 6. В противном случае содержимое аккумулятора не изменяется.

  2. Если после первого действия старшие четыре бита содержимого аккумулятора представляют число > 9 или установлен бит переноса, то старшие четыре бита инкрементируются на 6. В противном случае содержимое аккумулятора не изменяется.

Пример. Пусть необходимо сложить два десятичных числа:

2985

+

4936

7921

Для этого в программе необходимо выполнить следующие действия:

  1. Сбросить бит переносов и сложить младшие байты (это будет соответствовать сложение двух младших десятичных цифр):

85 = 10000101

+

36 = 00110110

перенос = 0

10111011

С=0 Вспомогательный перенос =0

  1. Выполнить команду DAA

Поскольку правые 4 бита > 9, то будет прибавлено 6 к этим битам содержимого аккумулятора:

(А) = 10111011

+

6 = 0110

11000001

Так как теперь левые 4 бита > 9, то будет добавлено и к этим битам:

(А) = 11000001

+

6 = 0110____

21 = 00100001

п еренос С=1

  1. Аккумулятор содержит теперь число 21. Складываем две следующие цифры:

29 = 00101001

49 = 01001001

перенос = 1

01110011

С =0 АС=1

  1. Выполняем команды DAA

Так как бит вспомогательного переноса АС установлен, то 6 будет прибавлено к аккумулятору:

(А) = 01110011

+

6 = 0110

79 =11000001

п еренос С=1

Так как левые 4 бита и правые 4 бита ≤ 9, а бит переноса сброшен, то никаких дальнейших действий не происходит. Таким образом, правильный десятичный результат равен 7921.

Для сложения десятичных чисел вполне подходит программа для сложения многобайтных чисел (MADD). Требуется только ввести команду DAA после команды A C M. Каждая итерация программного цикла в такой программе будет складывать по две десятичные цифры.