Учебное пособие: Цифровые вычислительные устройства и микропроцессоры приборных комплексов
ADD A,R7 ; двоичное сложение
DA A ; коррекция
результата
Алгебраическое
сложение с использованием дополнительного кода. Для сложения чисел со
знаком необходимо отрицательное число перевести в дополнительный код. В
двоичной системе счисления дополнительный код отрицательного числа формируется
по следующему правилу: инвертируются (путем замены 0 на 1 и 1 на 0) цифры всех
разрядов, кроме знакового, и в младший разряд прибавляется единица. Например,
если =1
101102, то = 1 010102
(знаковые разряды выделены полужирным шрифтом). Обратное преобразование из дополнительного
кода в прямой код производится по тому же правилу.
Рассмотрим
примеры выполнения операции сложения.
Пусть =0
10110, =1
01101.
Переносы 1
1 1 1
Первое
слагаемое 0
1 0 1 1 0
Второе
слагаемое 1
1 0 0 1 1
Сумма 0
0 1 0 0 1
Как
указывалось выше, перенос, возникающий из знакового разряда, отбрасывается.
Изменим на
обратный знаки слагаемых (по отношению к предыдущему примеру): =1 10110, =0
01101. Очевидно, ожидаемый ответ = 1 01001.
Переносы
1
Первое
слагаемое 1
0 1 0 1 0
Второе
слагаемое 0
0 1 1 0 1
Сумма 1
1 0 1 1 1
Сумма 1
0 1 0 0 1
Таким
образом, если результат сложения есть отрицательное число, то оно оказывается
представленным в дополнительном коде.
Для вычитания
8-разрядных чисел без знака может быть использовано выражение
, где – поразрядная
инверсия .
Другой способ вычитания может быть основан на следующем выражении: .
Пример 1.6. Вычитание байтов.
Операция вычитания может быть выполнена двумя способами: переводом вычитаемого
как отрицательного числа в дополнительный код с последующим сложением;
переводом уменьшаемого в обратный код с последующей инверсией суммы.
Пусть
требуется вычесть из A содержимое регистра R6. Вычитание выполнить в
соответствии с выражением . Установка флага C после выполнения
сложения будет свидетельствовать об отрицательном переполнении.
CPL A ; инверсия
аккумулятора
ADD A,R6 ; сложение
CPL A ; инверсия
суммы (получение разности)
Пример 1.7. Получить разность
2-байтных чисел без знака. Операнды располагаются в РПД. Адрес уменьшаемого
хранится в R1,
а вычитаемого – в R0. Результат поместить на место уменьшаемого:
; вычисление Z = X–Y
; X, Y – РПД
; R0 – адрес Y
; R1 – адрес X
; результат
на место X
SUBSTR: MOV A,@R0 ; загрузка
младшего байта Y
CPL A ;
получение дополнительного кода Y
INC A ;
ADD A,@R1 ; вычитание младших
байт
MOV @R0,A ; запоминание младшего
байта разности
INC R0 ;
переход к старшим байтам X и Y
INC R1 ;
MOV A,@R0 ; загрузка старшего
байта Y
CPL A ;
обратный код Y
ADDC A,@R1 ;
вычитание старших байт
MOV @R0,A ;
запоминание результата
Умножение
двоичных чисел. Пусть производится умножение чисел 11012 и 10112.
1 1 0 1 множимое
1 0 1 1 множитель
1 1 0 1 1-е
частичное произведение
1 1 0 1 2-е
частичное произведение
0 0 0 0 3-е
частичное произведение
1 1 0 1 4-е
частичное произведение
1 0 0 0 1 1 1
1 произведение
Как видно из
примера, при выполнении умножения формируются частичные произведения
(произведения множимого на цифры разрядов множителя), которые суммируются с
соответствующими сдвигами друг относительно друга. В цифровых устройствах
процессу суммирования частичных произведений придают последовательный характер:
формируется одно из частичных произведений, к нему с соответствующим сдвигом
прибавляется следующее частичное произведение, к полученной сумме двух
частичных произведений прибавляется с соответствующим сдвигом очередное
частичное произведение, и так далее, пока не будут просуммированы все частичные
произведения. Этот процесс суммирования можно начинать с младшего либо старшего
частичного произведения.
Ниже показаны
процессы при умножении с суммированием частичных произведений, начиная со
старшего частичного произведения (используется приведенный выше пример
умножения чисел 11012 и 10112).
1 1 0 1 4-е
частичное произведение
1 1 0 1 0 сдвиг
на один разряд влево
0 0 0 0 3-е
частичное произведение
1 1 0 1 0 сумма
4- и 3-го частичных произведений
1 1 0 1 0 0 сдвиг
на один разряд влево
1 1 0 1 2-е
частичное произведение
1 0 0 0 0 0 1
сумма 4-, 3- и 2-го частичных произведений
1 0 0 0 0 0 1
0 сдвиг на один разряд влево
1 1 0 1 1-е
частичное произведение
1 0 0 0 1 1 1
1 произведение
Рассмотрим
выполнение операции умножения с суммированием частичных произведений, начиная с
младшего частичного произведения на примере умножения чисел 11012 и
10112.
1 1 0 1 1-е
частичное произведение
0 1 1 0 1 сдвиг
на один разряд вправо
1 1 0 1 2-е
частичное произведение
1 0 0 1 1 1 сумма
1- и 2-го частичных произведений
1 0 0 1 1 1 сдвиг
на один разряд вправо
0 0 0 0 3-е
частичное произведение
1 0 0 1 1 1 сумма
1-, 2- и 3-го частичных произведений
1 0 0 1 1 1 сдвиг
на один разряд вправо
1 1 0 1 4-е
частичное произведение
1 0 0 0 1 1 1
1 сумма частичных произведений
1 0 0 0 1 1 1
1 сдвиг вправо, произведение
При умножении
целых чисел для фиксации произведения в разрядной сетке должно
предусматриваться число разрядов, равное сумме числа разрядов множимого и
множителя.
Пример 1.8. Умножить однобайтные
целые числа без знака. В регистре R1 размещен множитель, в регистре R2 – множимое. Двухбайтный
результат умножения будет размещен в аккумуляторе (старший байт) и в R1 (младший байт) вместо
множителя. В регистр R3, выполняющий функции счетчика программных циклов,
загружается число 8 (число бит множителя). Умножение выполняется младшими
битами вперед со сдвигом вправо частичного произведения. Последовательность
действий при этом методе умножения следующая:
– Содержимое
аккумулятора и регистра-расширителя R1 сдвигается вправо на один бит так, что младший
бит множителя, выдвигаемый из регистра R1, помещается в триггер
флага C.
– Если C = 1, то множимое
добавляется к содержимому аккумулятора, в противном случае никаких операций не
производится.
–
Декрементируется счетчик циклов R3, и если его содержимое не равно нулю, то все действия
повторяются.
– Перед
выходом из подпрограммы формируется окончательный результат сдвигом частичного
результата на один бит вправо:
MPL: MOV R3,#8 ; загрузка
счетчика циклов
CLR A ;
очистка аккумулятора
CLR C ;
очистка признака переноса
SHIFT: RRC A ; сдвиг
аккумулятора вправо
XCH A,R1 ;
обмен аккумулятора и R1
RRC A ;
сдвиг множителя с занесением
;
выдвигаемого бита в C
XCH A,R1 ;
обмен аккумулятора и R1
JNC RESULT ; если
C = 1, то суммирование
ADD A,R2 ;
прибавление множимого
RESULT: DJNZ R3,SHIFT ; декремент счетчика
и проверка
;
окончания операции (R3 = 0)
RRC A ;
сдвиг аккумулятора
XCH A,R1 ;
обмен
RRC A ;
сдвиг содержимого R1
XCH A,R1 ;
обмен
Страницы: 1, 2, 3, 4 |