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

Алгоритм умножения двоичных чисел с фиксированной запятой, представленных в дополнительном коде.

Рассмотрим алгоритм умножения двоичных чисел с фиксированной запятой, начиная с младших разрядов множителя, со сдвигом суммы частичных произведений и использованием дополнительного кода для отрицательных чисел.

Данный алгоритм умножения заключается в следующем:

  1. Сомножители представляются дополнительным кодом. Так как дополнительный код положительного числа совпадает с прямым кодом, то положительные числа будут представлены в прямом коде, а отрицательные – в дополнительном.

  2. Исходное значение суммы частичных произведений принимается равным 0.

  3. Если анализируемая цифра множителя равна 1, то к сумме частичных произведений прибавляется множимое в том коде, в котором оно представлено. Прибавление производится с выравниванием складываемых чисел по старшим разрядам. Если анализируемая цифра множителя равна 0, прибавление не производится.

  4. Сумма частичных произведений сдвигается на один разряд вправо, при этом, если сумма отрицательна, осуществляется модифицированный сдвиг.

  5. Пункты 3 и 4 последовательно выполняются для всех цифровых разрядов множителя, начиная с младшего.

  6. Если множитель – положительное число, полученный результат представляет собой произведение. Если множитель отрицателен, то для получения произведения к результату прибавляется множимое с обратным знаком. При этом прибавление производится с выравниванием складываемых чисел по старшим разрядам. Если результат размещается в двойном слове, то он предварительно сдвигается на один разряд вправо.

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

Моделирование функционирования алу при выполнении операции умножения чисел, представленных в прямом коде.

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

Операнды в АЛУ записываются в прямом коде. Множимое хранится в регистре R1, множитель в регистре R2. Результат операции умножения будет формироваться в регистрах RC и R2, в RC - старшая часть, в R2 - младшая.

Анализ множителя начинается с младшего разряда, т.е. на каждом шаге анализируется нулевой разряд регистра R2 и после анализа содержимое этого регистра сдвигается вправо на один разряд. Если нулевой разряд регистра R2 равен 1, то к сумме частичных произведений прибавляется множимое, а если в нулевом разряде множителя стоит 0, то к сумме частичных произведений прибавляется 0. Структурная схема АЛУ представлена на рис. 10.

Знак произведения формируется в результате анализа знаков сомножителей. Если сомножители имеют одинаковые знаки, то произведение получается положительным, если знаки различны - произведение будет отрицательным. После определения знака результата знаковые разряды сомножителей обнуляются и умножение производится над положительными числами.

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

Число циклов выполнения операции умножения равно n. Это объясняется тем, что до этапа коррекции (после выполнения (n-1) циклов) требуется сдвиг на 1 разряд вправо в связи с тем, что знаковый разряд обнуляется в начале выполнения операции. Этого можно достичь занося в счетчик циклов n, а не (n-1). Представление результата до и после этапа коррекции показано на рис. 11.

Блок-схема алгоритма операции умножения представлена на рис. 12.

Разрядность регистров АЛУ принимается n бит. Число циклов умножения равно разрядности операндов, т.е. n.

Р ис. 10. Структурная схема АЛУ для выполнения операции умножения

R3

знак

Результат до этапа коррекции

R3

знак

Результат после этапа коррекции

Рис. 11. Представление результата до и после этапа коррекции

Начало

Ввод операндов

SCH=n

Формирование знака результата:

R1[n]R2[n]

R1[n]=0; R2[n]=0;

RB=0; SCH=n

0”

1”

RA:=R1

RA:=0

SM:=RA+RB RC:=П(1)SM R3:=П(1)R2 R3[n-1]:=SM[0..0]

RB:=RC

R2:=R3

Печать содержимого всех регистров АЛУ

SCH:=SCH-1

<>0”

=0”

Печать результатов

Рис. 12. Блок-схема алгоритма выполнения операции умножения

Для наглядности проиллюстрируем выполнение операции умножения на микропрограммном уровне на примере 1.

Пример 1.

Умножим 117 на 45. Введем операнды:

множимое X = 01110101= 117

множитель Y = 00101101= 45

Формируем знак результата. Т.к. знаковый разряд множимого равен знаковому разряду множителя, следовательно, результат положительный. После ввода множимое записывается в регистр R1, множитель в регистр R2. Число циклов равно 8.

Цикл 1.

Младший разряд множителя - 1.

В регистр RA переписывается содержимое R1.

R1=01110101, RA=01110101, RВ:=0

Содержимое регистров RA и RB суммируется и записывается в регистр SM=01110101

Регистр R2=00101101 сдвигается вправо на один разряд и записывается в R3.

Регистр SM сдвигается вправо на один разряд и записывается в RC, вытесненный разряд записывается на место старшего разряда R3.

R3 переписывается в R2, RС в RВ.

После сдвигов содержимое регистров равно:

SM=01110101

RC=00111010

R2=00101101 (в конце цикла R2=10010110)

R3=10010110

RB=00111010

Содержимое счетчика циклов уменьшаем на единицу SCH:=7

Проверяем счетчик циклов на равенство нулю. SCH ≠0, следовательно, выполняем следующий цикл.

Цикл 2.

Младший разряд множителя - 0.

В RA записываем 0.

Суммируем.

RA=00000000

RB=00111010 (в конце цикла RВ=00011101)

SM=00111010

После сдвигов содержимое регистров равно:

SM=00111010

RC=00011101

R2=10010110 (в конце цикла R2=01001011)

R3=01001011

Содержимое счетчика циклов уменьшаем на единицу SCH:=6

Проверяем счетчик циклов на равенство нулю. SCH ≠0, следовательно, выполняем следующий цикл.

Цикл 3.

Младший разряд множителя - 1.

Суммируем.

RA=01110101

RB=00011101 (в конце цикла RВ=01001001)

SM=10010010

После сдвигов содержимое регистров равно:

SM=10010010

RC=01001001

R2=01001011 (в конце цикла R2=00100101)

R3=00100101

Содержимое счетчика циклов уменьшаем на единицу SCH:=5

Проверяем счетчик циклов на равенство нулю. SCH ≠0, следовательно, выполняем следующий цикл.

Цикл 4.

Младший разряд множителя - 1.

Суммируем.

RA=01110101

RB=01001001 (в конце цикла RВ=01011111)

SM=10111110

После сдвигов содержимое регистров равно:

SM=10111110

RC=01011111

R2=00100101 (в конце цикла R2=00010010)

R3=00010010

Содержимое счетчика циклов уменьшаем на единицу SCH:=4

Проверяем счетчик циклов на равенство нулю. SCH ≠0, следовательно, выполняем следующий цикл.

Цикл 5.

Младший разряд множителя - 0.

В RA записываем 0.

Суммируем.

RA=00000000

RB=01011111 (в конце цикла RВ=00101111)

SM=01011111

После сдвигов содержимое регистров равно:SM=01011111

RC=00101111

R2=00010010 (в конце цикла R2=10001001)

R3=10001001

Содержимое счетчика циклов уменьшаем на единицу SCH:=3

Проверяем счетчик циклов на равенство нулю. SCH ≠0, следовательно, выполняем следующий цикл.

Цикл 6.

Младший разряд множителя - 1.

Суммируем.

RA=01110101

RB=00101111 (в конце цикла RВ=01010010)

SM=10100100

После сдвигов содержимое регистров равно:

SM=10100100

RC=01010010

R2=10001001 (в конце цикла R2=01000100)

R3=01000100

Содержимое счетчика циклов уменьшаем на единицу SCH:=2

Проверяем счетчик циклов на равенство нулю. SCH ≠0, следовательно, выполняем следующий цикл.

Цикл 7.

Младший разряд множителя - 0.

В RA записываем 0.

Суммируем.

RA=00000000

RB=01010010 (в конце цикла RВ=00101001)

SM=01010010

После сдвигов содержимое регистров равно:

SM=01010010

RC=00101001

R2=01000100 (в конце цикла R2=00100010)

R3=00100010

Содержимое счетчика циклов уменьшаем на единицу SCH:=1

Проверяем счетчик циклов на равенство нулю. SCH ≠0, следовательно, выполняем следующий цикл.

Цикл 8.

Младший разряд множителя - 0.

В RA записываем 0.

Суммируем.

RA=00000000

RB=00101001 (в конце цикла RВ=00010100)

SM=00101001

После сдвигов содержимое регистров равно:

SM=00101001

RC=00010100

R2=00100010 (в конце цикла R2=00010001)

R3=10010001

Содержимое счетчика циклов уменьшаем на единицу SCH:=0

Счетчик циклов равен нулю.

В 16-ти разрядный регистр REZ записываем результат: из регистра R2 младшую часть, из RС старшую. Производим печать результата. Для этого обращаемся к подпрограмме печати чисел со знаком. Параметры подпрограммы:

Р - печатаемое число; Р=REZ;

РL - его разрядность; PL=16;

REZ=0001010010010001=5265.