Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OMT&МП2.doc
Скачиваний:
10
Добавлен:
13.11.2019
Размер:
2.35 Mб
Скачать

Умножение

В основе программ умножения лежит алгоритм — умножение в столбец, основанный на последовательных сдвигах и суммированиях. Отметим, что сдвиг возможен как влево, так и вправо. Например, при сдвиге влево умножение производится следующим образом:

10621=2226D

01101010

+00010101

01101010

+01101010__

1000010010

+01101010____

0100010110010

Отметим, что при умножении со сдвигом влево производится последовательный анализ разрядов множителя, начиная с младшего, до старшего с последующим сдвигом влево множимого и суммированием.

Классический алгоритм умножения со сдвигом влево приведен в описании лабо­раторной работы 5 "Выполнение арифметических операций".

Приведем один из возможных вариантов реализации этого алгоритма:

  1. Загружаем в счетчик числа циклов число N, соответствующее разрядности операндов.

  2. Обнуляем регистр - накопитель.

  3. Анализируем младший (текущий) бит множителя. Если он равен нулю, то пе­реходим к пункту 5.

  4. Прибавляем множимое к старшему слову регистра - накопителя.

  5. Сдвигаем содержимое регистра - накопителя вправо на один разряд.

  6. Сдвигаем множитель вправо на один разряд. При этом младший бит теряется.

  7. Уменьшаем содержимое счетчика числа циклов на единицу и переходим к пункту 3, если содержимое счетчика больше нуля.

Напомним, что умножение в двоичной арифметике двух чисел ограниченной разрядности без принятия специальных мер по определению знака результата имеет смысл только для положительных чисел. Поэтому, если в программе возникает необхо­димость умножить отрицательное число на положительное, то предварительно необходимо отрицательное число инвертировать.

Допустим, необходимо умножить два шестнадцатиразрядных числа, причем од­но из них может принимать как положительные, так и отрицательные значения. При этом в регистре R3 расположено отрицательное множимое, а в регистре R2 — положи­тельный множитель. Результат необходимо разместить в регистрах R1, R2. Для реализа­ции алгоритма умножения используем регистр R0 в качестве счетчика циклов.

На рис. 10.1 приведена подробная блок-схема умножения чисел:

(R3)(R2) = (R1,R2).

Р ис. 10.1. Блок-схема алгоритма умножения чисел

Один из возможных вариантов реализации этого алгоритма приведен в подпрограмме 10.1.

Подпрограмма 10.1.

Метка

Мнемоника

Комментарий

TST R3

Проверка содержимого R3

BPL M1

Переход, если (R3) >= 0

NEG R3

(R3)  -(R3)

М1

MOV #20,R0

Загрузка счетчика циклов (R0) = 16D.

CLR R1

Очистка (R1) = 0.

М3

BIT #1,R2

Проверка младшего разряда множителя

BEQ М2

Если младший бит = 0, то переход на М2

ADD R3,R1

Прибавить содержимое (R3) к накопителю

М2

ASR R1

Арифметический сдвиг вправо

ROR R2

Циклический сдвиг вправо

SOB R0,M3

(R0) = (R0)-1. Переход, если (R0) не равно 0.

HALT

Останов.

При выполнении этой программы в качестве регистра-накопителя используется собственно регистр R1 и часть регистра R2 по мере сдвига множителя вправо. Таким образом, подпрограмма 10.1 позволяет перемножать 15-ти разрядное и 16-ти разряд­ное число.

Подпрограмму 10.1 можно легко приспособить для умножения двух 16-ти разрядных положительных чисел (подпрограмма 10.2).

Подпрограмма 10.2.

Метка

Мнемоника

Комментарий

MOV #20,R0

Загрузка счетчика циклов

CLR R1

Очистка регистра-накопителя

M3

BIT #1,R2

Проверка младшего бита множителя

BEQ M1

Если бит равен 0, то переход на Ml

ADD R3,R1

Прибавить множимое к накопителю

BR М2

Безусловный переход на М2

M1

CLC

Очистка бита С

M2

ROR R1

Циклический сдвиг (R1) вправо

ROR R2

Циклический сдвиг (R2) вправо

SOB R0,M3

Переход на M3, если (R0)>0

HALT

Останов

Пользуясь приемами работы с числами, состоящими из нескольких слов можно увели­чить разрядность сомножителей. В подпрограмме 10.3 приведен пример умножения 32-х разрядного положительного числа, размещенного в регистрах R1 и R2 на 16-ти разряд­ное положительное число, расположенное в регистре R5. Результат операции разме­щаем в регистрах R3, R4, R5 Блок-схема подпрограммы 3 приведена ни рис. 10.2.

В качестве счетчика циклов используется регистр R0.

Подпрограмма 10.3.

(R1,R2)*(R5) = (R3,R4,R5)

Метка

Мнемоника

Комментарий

MOV #20,R0

Загрузка счетчика циклов

CLR R3

Очистка регистров накопителей R1,R4

CLR R4

M3

BIT #1,R5

Проверка младшего бита множителя

BEQ M1

Переход, если бит нулевой

ADD R2,R4

Прибавить множимое к регистру-накопителю

ADC R3

ADD R1,R3

BR M2

Безусловный переход

M1

CLC

Очистка бита С

M2

ROR R3

Цикл. сдвиг содержимого регистров.

R3, R4 ,R5 вправо.

ROR R4

ROR R5

SOB R0,M3

(R0) = (R0)-1. Переход, если R0>0

HALT

Останов

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