
Умножение двоичных целых чисел со знаком в доп.коде (сдвиг вправо СЧП и мт )
3. Разработка алгоритмов и микропрограмм реализации операций двоичной арифметики для
УЧЕБНОГО МИКРОПРОЦЕССОРА
3.1. Базовые алгоритмы реализации операции целочисленного умножения двоичных чисел со знаком, представленных в дополнительном коде
3.1.1. Общие сведения
Напомним реализацию операции умножения на ассемблере i8086 для целых двоичных чисел со знаком, представленных в дополнительном коде словарной длины.
При выполнении этой операции используется IMUL (собственно команда умножения со знаком) в следующей записи:
IMUL WORD PTR [r/m];
Прежде чем разработать алгоритмические варианты микропрограммной реализации операции приведем краткое словесное описание этой команды для словарной длины операндов.
Код операции
|
Команда |
Число тактовых циклов |
Описание |
F7 /5 |
IMUL r/m16 |
13-26 (i486) |
DX:AX := AX * слово из [r/m] (результат: AX= младшее слово, DX = старшее слово) |
Замечание. При выполнении команды IMUL r /m16 результат умножения доступен даже при установленном флаге переполнения, поскольку размер результата в два раза превышает размер множимого и множителя, что достаточно для обработки любого возможного результата.
Следует отметить, что процессор i486 использует алгоритм умножения типа "early-out". Фактическое число тактовых циклов зависит от позиции крайнего слева значащего бита в оптимизируемом множителе. Оптимизация выполняется как для положительных, так и для отрицательных значений.
Вследствие данного алгоритма в таблице приведены минимальные и максимальные значения числа тактовых циклов, необходимых для выполнения команды.
Фактическое число тактовых циклов зависит от числового значения модуля множителя m и определяется следующим образом:
при m <> 0 равно ((наименьшее целое число, большее (log2 |m|)) + 6 циклов), при m = 0 равно 9 циклам. Если же множитель есть операнд в памяти, то полученному значению необходимо прибавить три цикла.
Однако, при разработке алгоритма реализации операции будем опираться на регулярные алгоритмы, число циклов в которых постоянно и не зависит от величины значения множителя.
Из [ ] известны четыре основных регулярных алгоритма реализации операции поразрядного умножения над двоичными целыми числами со знаком, представленными в дополнительном коде. Эти алгоритмы требуют различные аппаратные затраты на реализацию, однако при этом схожи в одном – имеют одно и тоже количество циклов выполнения – n, где n – разрядность обрабатываемых целых двоичных чисел, включая знак. Перечислим названия указанных алгоритмов:
Алгоритм выполнения операции умножения, начиная с младших разрядов множителя при сдвиге суммы частичных произведений вправо на один разряд за цикл. При этом на каждом цикле также выполняется сдвиг множителя на один разряд вправо, множимое же остается неподвижным.
Алгоритм выполнения операции умножения, начиная с младших разрядов множителя при неподвижной сумме частичных произведений и сдвиге множимого влево на один разряд за цикл. При этом на каждом цикле также выполняется сдвиг множителя на один разряд вправо.
Алгоритм выполнения операции умножения, начиная со старших разрядов множителя при сдвиге суммы частичных произведений влево на один разряд за цикл. При этом на каждом цикле также выполняется сдвиг множителя на один разряд влево, множимое же остается неподвижным.
Алгоритм выполнения операции умножения, начиная со старших разрядов множителя при неподвижной сумме частичных произведений и сдвиге множимого вправо на один разряд за цикл. При этом на каждом цикле также выполняется сдвиг множителя на один разряд влево.
3.1.2. Описание первого варианта алгоритма умножения
Рассмотрим краткое описание первого алгоритма, как наиболее оптимального, и разработаем примеры операторной реализации на учебном микропрограммируемом микропроцессоре.
Как уже было отмечено, алгоритм выполнения операции умножения начинается с анализа младших разрядов регистра множителя (см. рис. 3.1). При этом на каждом цикле если очередной анализируемый значащий разряд множителя равен 1, то к старшей части регистра суммы частичных произведений (РгСЧП) прибавляется значение регистра множимого, иначе прибавляется значение 0. Затем здесь же, в конце текущего цикла производится сдвиг РгСЧП и множителя вправо на один разряд за цикл. Причем выталкиваемые вправо разряды РгСЧП заталкиваются в освобождающиеся старшие разряды регистра множителя. Само множимое же остается неподвижным. На последнем n-м цикле возможна коррекция результата умножения, полученного за предыдущие циклы: если знак множителя отрицателен (значение равно 1), то вместо очередного прибавления к РгСЧП числового значения множимого производится его вычитание из РгСЧП или +[-МН]доп.
Введем условные обозначения:
РгМН - n-разрядная регистровая ячейка для размещения кода множимого (МН),
РгМТ - n-разрядная регистровая ячейка для размещения кода множителя (МТ) или младшей части суммы частичных произведений,
РгСЧП - n-разрядная регистровая ячейка для размещения кода старшей части суммы частичных произведений.
Рис.3.1 - Схема реализации первого алгоритма умножения
Приведем словесное описание алгоритма выполнения операции
Проверить МН на равенство нулю. Если да, то завершить выполнение операции (п.7), поместив в регистры результата числовое значение без знакового нуля, иначе загрузить регистр МН значением МН, представленным в дополнительном коде.
Проверить МТ на равенство нулю. Если да, то завершить выполнение операции (п.7), поместив в регистры результата числовое значение без знакового нуля, иначе загрузить регистр МТ значением МТ, представленным в дополнительном коде.
(Начало цикла) Проверить младший разряд РгМТ[0] на равенство 0, если да, то к РгСЧП прибавить 0 и перейти к п.5, иначе выполнить п.4.
Выполняется последний (n-й) цикл алгоритма, то выполнить:
РгСЧП := РгСЧП - РгМН;
иначе для всех остальных циклов
РгСЧП := РгСЧП + РгМН.
Выполнить модифицированный сдвиг вправо над РгСЧП и над регистром МТ таким образом, что в РгСЧП [n-1] занести результат выполнения операции СЧП[n-1] xor OVR, а в старший разряд множителя МТ[n-1] занести значение младшего разряда РгСЧП. Здесь СЧП[n-1] – знак числового результата, полученного на выходе сумматора частичных произведений, а OVR – значение признака переполнения разрядной сетки СЧП.
Повторить пп.3-5 алгоритма n раз, где n-разрядность числа, включая его знак.
Конец алгоритма.
Следует отметить, что работу алгоритма можно ускорить, если операцию сдвига выполнять не на регистре РгСЧП, а комбинационно – за счет перекоса вправо разрядов, подаваемых с выхода СЧП на вход РгСЧП так, что в РгСЧП [n-1] занести результат выполнения операции СЧП[n-1] xor OVR, в РгСЧП [n-2] занести значение СЧП[n-1], в РгСЧП [n-3] занести значение СЧП[n-2] и т.д., в РгСЧП [0] занести значение СЧП[1], а содержимое СЧП[0] подать на (n-1)-й вход регистра МТ.
В результате при аппаратной реализации по схеме на рис. 3.1 каждый цикл алгоритма может быть выполнен за один такт.
Работу алгоритма поясним на нескольких числовых примерах.
Пример 3.1
Пусть необходимо умножить два числа 7 и -5.
Представим эти десятичные числа в форме четырех разрядного дополнительного двоичного кода: МН - 01112 и МТ - 10112, соответственно. Величина (–МН) равна 1001. Тогда имеют место действия, описанные таблицей 3.1
Таблица 3.1